执行用户=' dbo'引发错误。为什么呢?

时间:2017-09-05 12:25:21

标签: sql-server

当我创建一个新数据库并执行SELECT user时,它返回我的用户是dbo

所以我创建了一个新用户并执行用户创建的代码。但是当试图再次将其更改为dbo时,它会抛出一个它不存在的错误,但我可以看到它。为什么会这样?我执行错误了吗?

CREATE USER TestUser WITHOUT LOGIN
SELECT  user --Returns dbo
SELECT * FROM sys.database_principals --I can see both, dbo and TestUser and some other users of the system
EXECUTE AS user = 'TestUser'
SELECT  user --Returns TestUser
EXECUTE AS user = 'dbo'; -- Says that it doesn't exist

抛出错误:

  

无法作为数据库主体执行,因为主体" dbo"   不存在,这种类型的委托人不能被冒充,或者你   没有许可。

使用Microsoft SQL Server Management Studio 14.0.17119.0

2 个答案:

答案 0 :(得分:4)

因为"您没有权限"。以EXECUTE AS作为新用户完成后的 Everything ,包括尝试模拟新用户,TestUser,而不是系统管理员,无法模拟dbo。而是REVERT

答案 1 :(得分:1)

密钥在错误消息“此类主体不能被模拟”。基本上,用户'dbo'应被视为别名或角色(数据库所有者)。因此,当您使用登录名创建数据库/表/ etc时,您具有数据库所有者权限。例如,如果以用户'sa'身份登录并创建表,则完整限定表名称为DataBaseName.dbo.TableName。

为什么你需要执行'dbo'?最好不要将数据库所有者权限分配给一堆用户,而是保持用户/角色/权限的隔离。