澄清为什么EXECUTE AS USER / LOGIN没有返回预期的结果?

时间:2012-10-23 19:34:39

标签: 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;

但是会抛出以下错误:

Cannot execute as the database principal because the principal "dev\spadmin" does not exist, this type of principal cannot be impersonated, or you do not have permission.

用户是数据库的dbo,当我在management studio中打开属性时,我可以看到它与该登录相关联。另一方面,运行EXECUTE AS LOGIN = 'domain\username'会返回结果。如果我明确地运行EXECUTE AS USER = 'dbo',我会得到结果。我还有一个不同的数据库,其中同一场景返回EXECUTE AS USEREXECUTE AS LOGIN的结果。

在另一个使用不同用户的情况下,我运行了EXECUTE AS LOGIN = 'domain\username'但我没有得到结果,但我确实得到EXECUTE AS USER = 'domain\username'的结果。

这些方案中的两个用户都与作为数据库db_owner成员的登录相关联。

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

3 个答案:

答案 0 :(得分:11)

问题是因为登录domain\username是数据库的dbo,意味着该数据库中相应用户的名称是dbo和< strong> domain\username

答案 1 :(得分:1)

运行ALTER AUTHORIZATION ON DATABASE::[<yourdb>] TO [sa]

答案 2 :(得分:0)

我对我编写的存储过程有同样的错误。

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

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命令。