我在sql server数据库中设置了多个视图。这些视图是从声明中带有WITH EXECUTE AS 'proxyuser'子句的存储过程中选择的。它执行的选择语句是动态创建的,并使用sp_executesql存储过程执行。一切都正常工作,直到有必要在其中一个视图的定义中包含到另一个数据库中的表的连接,这样视图就可以从它所在的数据库和同一服务器上的另一个数据库中进行选择。
我得到的错误是:服务器主体"proxyuser"无法在当前安全上下文中访问数据库"mydb"。
这是我尝试过的:
-
从第二个数据库中删除proxyuser,并按照此处的建议将登录映射到数据库。http://sqlmusings.wordpress.com/2008/06/12/issue-server-principal-is-not-able-to-access-the-database-under-the-current-security-context/
-
启用跨数据库所有权链。http://social.msdn.microsoft.com/Forums/en-US/sqlsecurity/thread/07dcab8c-b830-4ca9-8afc-3e75772f44d3/
和我的场景不满足Microsoft支持文章#913422概述的要求,该文章描述了相同的错误消息。代理使用Sql Server身份验证,而不是Windows身份验证。
任何想法?
在一个不同的项目上工作了很长时间后,我终于回到了这个问题上。我解决了这个问题,所以我不再使用WITH EXECUTE作为"proxyuser"语法。我正在连接的用户有足够的权限来执行该操作。我不知道为什么我以前没有试过。