今天下午還原sql資料庫以後,不管怎麼樣也無法登陸論壇,仔細檢查才發現,sql server表還是以前建立的使用者,而又無法刪除,,這些表的許可權都不是DBO, 後來在網上找了半天,才找到解決辦法,這裡先儲存下來。用來解決大家在還原了sql資料庫以後,無法刪除原登陸使用者的問題。
--執行這個語句,就可以把當前庫的所有表的所有者改為dbo
exec sp_msforeachtable 'sp_changeobjectowner ''?'', ''dbo'''
--如果是要使用者表/預存程序/視圖/觸發器/自訂函數一齊改,則用遊標(不要理會錯誤提示)
declare tb cursor local for
select 'sp_changeobjectowner ''['+replace(user_name(uid),']',']]')+'].['
+replace(name,']',']]')+']'',''dbo'''
from sysobjects
where xtype in('U','V','P','TR','FN','IF','TF') and status>=0
open tb
declare @s nvarchar(4000)
fetch tb into @s
while @@fetch_status=0
begin
exec(@s)
fetch tb into @s
end
close tb
deallocate tb
go
1. sp_changeobjectowner
更改當前資料庫中對象的所有者。
文法
sp_changeobjectowner [ @objname = ] 'object' , [ @newowner = ] 'owner'
參數
[@objname =] 'object'
當前資料庫中現有的表、視圖或預存程序的名稱。object 的資料類型為 nvarchar(517),沒有預設值。object 可用現有對象所有者限定,格式為 existing_owner.object。
[@newowner =] 'owner'
即將成為對象的新所有者的安全帳戶的名稱。owner 的資料類型為 sysname,沒有預設值。owner 必須是當前資料庫中有效 Microsoft? SQL Server? 使用者或角色或 Microsoft Windows NT? 使用者或組。指定 Windows NT 使用者或組時,請指定 Windows NT 使用者或組在資料庫中已知的名稱(用 sp_grantdbaccess 添加)。
傳回碼值
0(成功)或 1(失敗)
注釋
對象所有者(或擁有對象的組或角色的成員)對對象有特殊的許可權。對象所有者可以執行任何與對象有關的 Transact-SQL 陳述式(例如 Insert、Update、Delete、Select 或 EXECUTE),也可以管理對象的許可權。
如果擁有對象的安全帳戶必須要除去,但同時要保留該對象,請使用 sp_changeobjectowner 更改對象所有者。該過程從對象中刪除所有現有許可權。在運行 sp_changeobjectowner 之後,需要重新應用要保留的任何許可權。
由於這個原因,建議在運行 sp_changeobjectowner 之前,編寫現有許可權的指令碼。一旦更改了對象的所有權,可能要使用該指令碼重新應用許可權。在運行該指令碼之前需要在許可權指令碼中修改對象所有者。有關編寫資料庫指令碼的更多資訊,請參見編寫資料庫文檔和指令碼。
可以使用 sp_changedbowner 更改資料庫的所有者。
許可權
只有 sysadmin 固定伺服器角色和 db_owner 固定資料庫角色成員,或既是 db_ddladmin 固定資料庫角色又是 db_securityadmin 固定資料庫角色的成員,才能執行 sp_changeobjectowner。
樣本
下面的樣本將 authors 表的所有者改為 Corporate\GeorgeW。
EXEC sp_changeobjectowner 'authors', 'Corporate\GeorgeW'
請參見
改變資料庫擁有者:sp_changedbowner
------------------------------以上摘自sql server 的聯機叢書
注意:
使用sqlserver2000改變對象(object)(如Table,SP,View)的所有者(owner)時,需要注意一點:
如果對象改變前的owner為dbo,則直接用:exec sp_changeobjectowner 對象名,新的所有者名就可以成功。如果再需要改變該對象的所有者,則要用如下文法:
exec sp_changeobjectowner "[所有者].[對象名]",新的所有者。注意,雙引號不可省略,否則提示objectname does not exist。
EXEC sp_changeobjectowner 'cqadmin.authors', 111
2.建與原表結構相同表,然後把資料從原表插入到新表,操作方法:
在sql server企業管理器中選擇原表點右鍵,選擇“所有任務/生存SQL指令碼”,儲存產生的指令碼,在指令碼中把表的原所有者改成新所有者。然後再把該指令碼運行一遍,資料庫中就新產生了一個表,所有者是新所有者,原來的表還在資料庫中沒有被替換。新表和舊錶 表名相同,所有者不同,此時的新表中沒有資料。
然後再運行下面的語句往新表中插入資料:
Insert INTO CQAdmin.m_actiondef //新所有者.新表名
Select *
FROM RegaltecDefSchema. CQAdministrator.m_actiondef // 資料庫名.舊所有者.舊錶名
運行完了就做完了,可以把舊錶刪掉,也可以留著。