IAm*_*rey 8 sql-server-2008 sql-server
如果这个问题重复了另一个已经问过的问题,我深表歉意。我已经搜索了几个小时,但没有找到适合我的情况。
期望的结果
使用 SQL 身份验证的用户对 Server1(默认实例)上的 Database1 具有执行权限,仅此而已。用户执行一个存储过程,作为其进程的一部分,访问 Server1\Instance2 上的数据库 2。我希望它既安全又简单(两者都很重要)。
更多信息
我的 Windows 凭据可以访问两个实例(位于同一台服务器上)。因此,我可以毫无困难地在我的登录名下执行存储过程。但是,我不想给用户我的访问级别。我还需要使用 SQL 登录,因为用户不在域中。
我想要的是为存储过程提供我对该过程的访问级别。由于我是系统管理员,这将为用户提供该过程所需的一切。如果我让它工作,我可能会为此目的创建一个帐户而不是使用我的帐户,但无论哪种方式都是安全的,因为我控制了存储过程的作用。
我尝试将“WITH EXECUTE AS”语句放在我的存储过程中,但无法获取我的 Windows 登录信息。当我把它放进去时,我会在编译存储过程时得到以下错误:
无法以用户 'domain\jdoe' 身份执行,因为它不存在或您没有权限。
用户在两台服务器上都是系统管理员,就像我说的那样,所以我不确定它还需要什么。
我研究了以下内容:
我觉得我错过了一些明显的东西,但我不确定它是什么。因为我整天都在用头撞墙,所以我可能离得太近了,看不到它。如果这里有人能帮我一把或指出我正确的方向,我将不胜感激。我会说我已经阅读了很多 MSDN 文章(我讨厌他们 - 他们似乎从来没有告诉我我想知道什么)。我真正想要的是一个简单、易于遵循的教程,它会引导我了解如何做到这一点。除此之外,即使是我需要走的方向的一般指示也会有所帮助。
在广泛阅读该主题并进行大量实验后,我相信我已经对这个问题得出了结论。EXECUTE AS 语句并非设计为跨实例工作,不会产生重大安全隐患。我希望有一种方法告诉我的程序我想要在什么 Windows 身份下运行,因为 Windows 身份可以访问多个服务器上的多个资源。然而,即使在尝试了一堆不同的设置之后,很明显我必须削弱其他安全措施才能允许存储过程冒充我。
似乎没有很多关于跨实例或跨服务器过程的信息。我想这样做的原因是这样做的安全性和性能影响。然而,我相信在某些情况下它很重要,而且这样做的解决方案似乎很复杂并且非常针对特定场景。我发现了一篇好文章,它至少帮助我理解了我的一些选择。它并不专注于跨实例访问,但它确实给了我我正在寻找的线索。我鼓励您检查一下:
http://www.sommarskog.se/grantperm.html
我仍然对这个问题的其他解决方案感兴趣,但我现在的解决方案有两个。首先,如果我绝对需要通过一个存储过程访问两个数据库,我必须使用 Windows 登录。不过,我会尽可能避免这种情况,因为它确实会导致性能问题(多服务器锁定、网络复杂性、无法优化查询等)。 其次,我通过单独的、特定于数据库的调用从每个数据库获取数据。这意味着我在合并数据之前将数据带回客户端。它不像我想要的那样高效或干净,但它似乎是最安全的解决方案。