2012-09-12 79 views

回答

98

可能會出現此問題,當從備份還原的數據庫和數據庫所有者的SID不匹配在主數據庫中列出的所有人SID。下面是使用「ALTER授權」的解決方案建議的語句中的錯誤消息:

DECLARE @Command VARCHAR(MAX) = 'ALTER AUTHORIZATION ON DATABASE::[<<DatabaseName>>] TO 
[<<LoginName>>]' 

SELECT @Command = REPLACE(REPLACE(@Command 
      , '<<DatabaseName>>', SD.Name) 
      , '<<LoginName>>', SL.Name) 
FROM master..sysdatabases SD 
JOIN master..syslogins SL ON SD.SID = SL.SID 
WHERE SD.Name = DB_NAME() 

PRINT @Command 
EXEC(@Command) 
+0

謝謝!這似乎更合適。你認爲用quotename()代替在字符串中放置'[''是不值得的嗎?也可以選擇var DBName和var LoginName,然後將它們放在var Command中而不是使用REPLACE()? – JDPeckham

+3

如果您的DB名稱中包含空格或特殊字符(如' - '),則此腳本會給您提供錯誤。因此,只需將[]括號如下所示:'ALTER AUTHORIZATION ON DATABASE :: [<< DatabaseName >>] TO [<>]' – buhtla

+6

當我運行這個時,我得到錯誤「建議的新數據庫所有者已經是用戶或別名在數據庫中「 – MobileMon

25

已將此添加到tSQLt的頂部。 class.sql腳本

declare @user varchar(50) 
SELECT @user = quotename(SL.Name) 
    FROM master..sysdatabases SD inner join master..syslogins SL 
    on SD.SID = SL.SID 
Where SD.Name = DB_NAME() 
exec('exec sp_changedbowner ' + @user) 
4

Necromaning:
如果你不想使用SQL-Server 2000和的視圖(不建議使用),使用此:

-- Restore sid when db restored from backup... 
DECLARE @Command NVARCHAR(MAX) 
SET @Command = N'ALTER AUTHORIZATION ON DATABASE::<<DatabaseName>> TO <<LoginName>>' 
SELECT @Command = REPLACE 
        ( 
         REPLACE(@Command, N'<<DatabaseName>>', QUOTENAME(SD.Name)) 
         , N'<<LoginName>>' 
         , 
         QUOTENAME 
         (
          COALESCE 
          (
           SL.name 
           ,(SELECT TOP 1 name FROM sys.server_principals WHERE type_desc = 'SQL_LOGIN' AND is_disabled = 'false' ORDER BY principal_id ASC) 
         ) 
        ) 
       ) 
FROM sys.databases AS SD 
LEFT JOIN sys.server_principals AS SL 
    ON SL.SID = SD.owner_sid 


WHERE SD.Name = DB_NAME() 

PRINT @command 
EXECUTE(@command) 
GO 

還可以防止奇怪命名數據庫或用戶上的錯誤,並且還修復錯誤,如果沒有用戶相關聯(使用sa登錄)。

7

應用數據庫下面的腳本,你得到的錯誤:

EXEC sp_changedbowner 'sa' 

ALTER DATABASE [database_name] SET TRUSTWORTHY ON 
+0

請檢查這[URL](http://stackoverflow.com/help)它將有助於提高您的內容質量 –

+1

這對我有效。 –

-2

如果要導入一個新的CLR,如果你有剛剛成立薩如業主爲您DATABSE像下面這樣應該是工作

此錯誤消息

修改數據庫授權:: []至[sa]