数据库所有者是服务器级主体(即登录名)或 Windows 用户(不一定具有登录名)。如 cmets 中所述,dbo 是数据库主体而不是服务器主体(假设您碰巧没有名为 dbo 的登录名)。
所有者存储在主数据库中,并作为sys.databases 目录视图的owner_sid 列可见:
SELECT name AS DatabaseName, owner_sid, SUSER_SNAME(owner_sid) AS OwnerName
FROM sys.databases
WHERE name = N'MyDb';
数据库所有者也作为众所周知的dbo用户存储在数据库本身中:
SELECT SUSER_SNAME(sid) AS OwnerName, sid
FROM sys.database_principals AS dp
WHERE name = N'dbo';
当一个数据库被恢复并且它不存在时,所有者(授权)最初被设置为恢复数据库的人。但是,数据库本身中的dbo 条目保持不变。这会导致 sys.databases 中的所有者与 sys.database_principals dbo 用户之间的不匹配。需要在还原后对所需所有者执行ALTER AUTHORIZATION ON DATABASE 以纠正不匹配。
下面的脚本演示了当执行还原的个人未以sa 登录时出现的问题。
CREATE DATABASE MyDb; --database is owned by current login
ALTER AUTHORIZATION ON DATABASE::MyDb TO sa; --sa is an example; can be any login
--shows owners are same (sa)
SELECT name AS DatabaseName, owner_sid, SUSER_SNAME(owner_sid) AS OwnerName
FROM sys.databases
WHERE name = N'MyDb';
SELECT SUSER_SNAME(sid) AS OwnerName, sid
FROM MyDb.sys.database_principals AS dp
WHERE name = N'dbo';
BACKUP DATABASE MyDb TO DISK=N'C:\Backups\MyDb.bak' WITH INIT;
DROP DATABASE MyDb;
RESTORE DATABASE MyDb FROM DISK=N'C:\Backups\MyDb.bak';
--shows owners are different (current user and sa)
SELECT name AS DatabaseName, owner_sid, SUSER_SNAME(owner_sid) AS OwnerName
FROM sys.databases
WHERE name = N'MyDb';
SELECT SUSER_SNAME(sid) AS OwnerName, sid
FROM MyDb.sys.database_principals AS dp
WHERE name = N'dbo';
ALTER AUTHORIZATION ON DATABASE::MyDb TO sa; --sa is an example; can be any login
--shows owners are same (sa)
SELECT name AS DatabaseName, owner_sid, SUSER_SNAME(owner_sid) AS OwnerName
FROM sys.databases
WHERE name = N'MyDb';
SELECT SUSER_SNAME(sid) AS OwnerName, sid
FROM MyDb.sys.database_principals AS dp
WHERE name = N'dbo';
以下是the documentation 关于数据库所有者主体的摘录。
新的所有者主体必须是以下之一:
A SQL Server authentication login.
A Windows authentication login representing a Windows user (not a group).
A Windows user that authenticates through a Windows authentication login representing a Windows group.