数据库所有者是服务器级别的主体(即登录名)或 Windows 用户(不一定具有登录名)。如评论中所述,dbo
是数据库主体而不是服务器主体(假设您碰巧没有名为 的登录名dbo
)。
所有者存储在主数据库中,并作为目录视图的owner_sid
列可见:sys.databases
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';
以下是有关数据库所有者主体的文档的摘录。
新的所有者主体必须是以下之一:
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.