SID của chủ sở hữu cơ sở dữ liệu được ghi lại trong cơ sở dữ liệu chính khác với SID của chủ sở hữu cơ sở dữ liệu


86

Khi tôi cố gắng cài đặt tSQLt vào cơ sở dữ liệu hiện có, tôi gặp lỗi sau:

SID của chủ sở hữu cơ sở dữ liệu được ghi trong cơ sở dữ liệu chính khác với SID của chủ cơ sở dữ liệu được ghi trong cơ sở dữ liệu ''. Bạn nên khắc phục tình huống này bằng cách đặt lại chủ sở hữu cơ sở dữ liệu '' bằng cách sử dụng câu lệnh ALTER AUTHORIZATION.

Câu trả lời:


141

Sự cố này có thể phát sinh khi cơ sở dữ liệu được khôi phục từ bản sao lưu và SID của chủ sở hữu cơ sở dữ liệu không khớp với SID của chủ sở hữu được liệt kê trong cơ sở dữ liệu chính. Đây là giải pháp sử dụng câu lệnh "ALTER AUTHORIZATION" được đề xuất trong thông báo lỗi:

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)

Cảm ơn! Điều đó có vẻ thích hợp hơn. Bạn có nghĩ rằng việc sử dụng quotename () thay vì đặt '[' trong chuỗi là không đáng không? Ngoài ra, có thể chọn vào var DBName và var LoginName sau đó ghép chúng lại với nhau thành var Command thay vì sử dụng REPLACE ()?
JDPeckham 14/11/12

3
Nếu bạn có khoảng trắng hoặc các ký tự đặc biệt như '-' trong tên DB của bạn, tập lệnh này sẽ gây ra lỗi cho bạn. Vì vậy, chỉ cần đặt [] dấu ngoặc như thế này: 'ALTER ỦY QUYỀN VỀ CƠ SỞ DỮ LIỆU :: [<< >> DatabaseName] ĐẾN [<< >> LOGINNAME]
buhtla

9
Khi tôi chạy điều này, tôi gặp lỗi "Chủ sở hữu cơ sở dữ liệu mới được đề xuất đã là người dùng hoặc bí danh trong cơ sở dữ liệu"
MobileMon 27/1113

Đối với tập lệnh này, liên kết bên trong với syslogins không hoạt động đối với tôi có lẽ vì sự không khớp SID vấn đề.
crokusek

31

Đã thêm điều này vào đầu tập lệnh 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)

Điều này hoạt động như một sự quyến rũ tSQLt Version: 1.0.5873.27393và dường như là một giải pháp đơn giản hơn. Sử dụng MS SQL Server 2019 Developer và SSMS 18.
silver

19

Áp dụng tập lệnh dưới đây trên cơ sở dữ liệu, bạn gặp lỗi:

EXEC sp_changedbowner 'sa'

ALTER DATABASE [database_name] SET TRUSTWORTHY ON 

Các trường hợp tuyên bố thứ hai lỗ hổng bảo mật sau: VA1102 - Các bit Trustworthy nên bị vô hiệu hóa trên tất cả các cơ sở dữ liệu ngoại trừ MSDB
Shadi Namrouti

5

Necromoming:
Nếu bạn không muốn sử dụng các dạng xem SQL-Server 2000 (không được dùng nữa), hãy sử dụng cái này:

-- 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

Đồng thời ngăn lỗi trên cơ sở dữ liệu hoặc người dùng có tên kỳ lạ và cũng sửa lỗi nếu không có người dùng nào được liên kết (sử dụng đăng nhập sa).


3

Cách đơn giản nhất để thay đổi chủ sở hữu DB là:

EXEC SP_ChangeDBOwner 'sa'

Vâng, chúng tôi đã thiết lập điều đó.
JDPeckham

0

Tôi cũng gặp phải vấn đề này và nhận thấy rằng Chủ sở hữu của cơ sở dữ liệu đích không tồn tại trong cơ sở dữ liệu chính. Ánh xạ người dùng đó với cơ sở dữ liệu chính đã giải quyết được vấn đề cho tôi.


Ánh xạ tới chủ không thay đổi chủ sở hữu. Bạn nên chạy phần sau sau khi lập bản đồ: EXEC sp_changedbowner 'TheOwnerName'
Shadi Namrouti 10/12/19
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.