一,修改數據庫遠程登陸賬號(固然也能夠手工在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