mssql 表 登錄名 修改

一,修改數據庫遠程登陸賬號(固然也能夠手工在sql數據庫內建設)sql

use abc數據庫

go安全

exec sp_change_users_login 'update_one','abc_f','abc_f'ide

go函數


數據庫導入完成後,還有一個地方須要確認,就是通常客戶的表格以及存儲過程的屬主都是默認的dbo,在這種權限下,用戶abc_f對錶格是具備讀寫權限的,能夠添加刪除表格,可是沒法更改現有屬主爲dbo的表格的表結構,對於存儲過程,abc_f沒有任何讀寫執行權限,這就可能形成用戶程序出現問題。post

從原理講,解決方法有二,擴大數據庫用戶的權限,或者將這些表格and存儲過程的屬主修改成abc_f,前種方法涉及安全問題,不容許作此類操做,因此只能使用後種方法。大數據


二,基本修改對象屬主的存儲過程使用方法以下:ui

use abc對象

gostring

exec sp_changeobjectowner 'tablename','abc_f'

go


三,上述語句只能更改單個對象,沒法實現批量修改,不過對於表格,SQL Server自帶一個遍歷表格的存儲過程sp_msforeachtable,對於修改全部表格屬主的語句以下:

use abc

go

sp_msforeachtable 'sp_changeobjectowner ''?'',''abc_f'''

go


注意對於引號裏面字段須要使用兩個單引號來界定。


四,若是客戶數據庫沒有存儲過程以及其餘對象,完成上述操做後,應該能夠發現客戶數據庫全部表格屬主都已經替換爲客戶的用戶,這樣就能夠對錶格做任何修改。若是客戶數據庫還含有存儲過程等其餘對象,由於SQL Server自己沒有提供相似msforeachprodure的存儲過程,因此不能批量修改這類對象。解決辦法是使用本身寫存儲過程來實現,下面代碼能夠創建一個msforeachobject的存儲過程,用於遍歷數據庫中的各類對象,只需將這段代碼放入查詢分析器執行便可。

USE MASTER

GO

CREATE proc sp_MSforeachObject

@objectType int=1,

@command1 nvarchar(2000), 

@replacechar nchar(1) = N'?', 

@command2 nvarchar(2000) = null,

   @command3 nvarchar(2000) = null, 

@whereand nvarchar(2000) = null,

@precommand nvarchar(2000) = null, 

@postcommand nvarchar(2000) = null

as

/* This proc returns one or more rows for each table (optionally, matching @where), with each table defaulting to its


own result set */

/* @precommand and @postcommand may be used to force a single result set via a temp table. */


/* Preprocessor won't replace within quotes so have to use str(). */

declare @mscat nvarchar(12)

select @mscat = ltrim(str(convert(int, 0x0002)))


if (@precommand is not null)

exec(@precommand)


/* Defined @isobject for save object type */

Declare @isobject varchar(256)


select @isobject= case @objectType when 1 then 'IsUserTable'

        when 2 then 'IsView'

        when 3 then 'IsTrigger'

        when 4 then 'IsProcedure' 

        when 5 then 'IsDefault'   

        when 6 then 'IsForeignKey'

        when 7 then 'IsScalarFunction'

        when 8 then 'IsInlineFunction'

        when 9 then 'IsPrimaryKey'

        when 10 then 'IsExtendedProc'    

        when 11 then 'IsReplProc'

        when 12 then 'IsRule'

                 end


/* Create the select */

/* Use @isobject variable isstead of IsUserTable string */

EXEC(N'declare hCForEach cursor global for select ''['' + REPLACE(user_name(uid), N'']'', N'']]'') + '']'' + ''.'' + ''['' +


REPLACE(object_name(id), N'']'', N'']]'') + '']'' from dbo.sysobjects o '

       + N' where OBJECTPROPERTY(o.id, ) = 1 '+N' and o.category & ' + @mscat + N' = 0 '

      + @whereand)


declare @retval int

select @retval = @@error

if (@retval = 0)

exec @retval = sp_MSforeach_worker @command1, @replacechar, @command2, @command3


if (@retval = 0 and @postcommand is not null)

exec(@postcommand)


return @retval


GO


五,上段代碼是仿製msforeachtable建立的存儲過程,能夠用於遍歷各類對象,使用方法以下:

use abc

go

EXEc sp_MSforeachObject @command1="sp_changeobjectowner '?', 'abc_f'",@objectType=1

go


最後一個參數objectType表明對象類型,1爲表格,2爲視圖,3爲觸發器,4爲存儲過程,7能夠修改該客戶本身定義的函數。

經過此命令能夠將各種對象的屬主改成客戶的數據庫帳號,則能夠解決上述數據庫權限問題


收藏於 2009-04-02

相關文章
相關標籤/搜索