Sql 澄清为什么“以用户身份执行/登录”未返回预期结果?

Sql 澄清为什么“以用户身份执行/登录”未返回预期结果?,sql,sql-server,sql-server-2008,sql-server-2008-r2,ssms,Sql,Sql Server,Sql Server 2008,Sql Server 2008 R2,Ssms,我正在对数据库运行以下查询: execute as user = 'domain\username' select * from fn_my_permissions(null, 'DATABASE') order by subentity_name, permission_name revert; 但会引发以下错误: 无法作为数据库主体执行,因为主体“dev\spadmin”不存在,无法模拟此类型的主体,或者您没有权限。 用户是数据库的dbo,当我在ManagementStudio中打开属性时

我正在对数据库运行以下查询:

execute as user = 'domain\username'
select * from fn_my_permissions(null, 'DATABASE')
order by subentity_name, permission_name
revert;
但会引发以下错误:

无法作为数据库主体执行,因为主体“dev\spadmin”不存在,无法模拟此类型的主体,或者您没有权限。

用户是数据库的dbo,当我在ManagementStudio中打开属性时,我可以看到它与该登录关联。另一方面,运行
executeaslogin='domain\username'
会返回结果。如果我显式运行
executeasuser='dbo'
,就会得到结果。我还有一个不同的数据库,在这个数据库中,相同的场景会返回
executeasuser
executeaslogin
的结果

在另一个使用不同用户的场景中,我运行了
executeaslogin='domain\username'
,没有得到结果,但我确实使用
executeasuser='domain\username'
得到了结果

这些场景中的两个用户都与数据库的
db\u owner
成员的登录关联


有人能告诉我为什么这些查询没有返回我期望的结果吗?如果我遗漏了任何重要信息,请告诉我。谢谢

在数据库上运行
ALTER AUTHORIZATION::[]到[sa]

问题在于,因为登录名
域\用户名
是数据库的dbo,这也意味着数据库中相应用户的名称是
dbo
而不是
domain\username

我编写的存储过程也有相同的错误

我发现错误是由我在查询中指定数据库名称的方式引起的

SELECT emp_no 
FROM   db_name.employee 
WHERE  emp_no = 1234
当我从脚本中删除数据库名称时,我正在执行
db_name2
上的过程

SELECT emp_no 
FROM   employee 
WHERE  emp_no = 1234
它工作得很好


我认为日志访问权限的减少不允许使用其他数据库或
use db_name
命令

我不希望更改数据库的任何内容,因为运行此查询的应用程序最终将在客户机上使用。我只想获得特定用户/登录名的权限,以确定其配置是否正确。除非我误解了这个查询实际上在做什么。让我困惑的是,
executeasuser='domain\username'
在另一个数据库上工作,其中用户是dbo,而不是这个数据库。知道为什么吗?我猜他们以前是非DBO用户,后来成为数据库的所有者,但他们的旧用户条目被留下了。这是不应该发生的,但我确实看到了。我检查了两个用户之间的区别。
executeasuser
查询未工作的用户的服务器角色为dbcreator、public和securityadmin。查询所在的用户具有所有服务器角色。一旦我赋予它与另一个用户相同的角色,我就得到了与另一个用户相同的结果。然后问题可能是您的原始执行上下文缺少模拟该用户的权限。