脚本
它的相当涉及解释,但我有一个过程更新实例1上的两个数据库中的数据,并作为进程的一部分(其相关的原因光标)它需要更新实例2的数据库,其中满足特定条件。 如果引用instance2的代码行被更改为本地实例,则该过程将在不到一分钟的时间内运行。 如果它被设置为参考实例2上的正确位置,则该过程每个logging需要30-40秒(我们从未让它完成)。
历史 (今天早上)
查看估计的执行计划,在实例2上进行单个logging更新的代码正在对logging深度为100k的表使用远程扫描。
我改变了这个
Update C set col1 = @val1, col2 = @val2 where col2 = @ID
至
Execute ('Update C set col1 = @val1, col2 = @val2 where col2 = @ID') as user1 at Instance2
其中Instance2是链接服务器,user1是在连接服务器上模拟启用的sqllogin名。 这是因为更新过程可以利用col2上的聚集索引,从而避免表扫描。
问题
我们现在正在获取安全/身份validation错误,脚本失败
消息15274,级别16,状态1,程序“procname”,行263
对远程服务器的访问被拒绝,因为当前的安全上下文不受信任。
任何人都可以告诉我什么,我需要configuration允许此更新执行吗? 或者,有没有更好的方法,我可以得到更新使用Instance2上的表上的索引? 从我的知识表提示不允许在远程查询…?
非常感谢
乔纳森
有两个主要问题突出给我:
你的execute语句将查询中的string(例如'@ val1')发送到Instance2,因为它们都包含在一个string中。 为了发送这些值,您需要将该部分的execute语句改为:
Execute ('Update C set col1 = ' + @val1 + ', col2 = ' + @val2 + ' where col2 = ' + @ID) as user1 at Instance2
请注意,上面的代码假设@ val1和@ val2是不需要引号的types,否则你可以使用下面的代码:
Execute ('Update C set col1 = ''' + @val1 + ''', col2 = ''' + @val2 + ''' where col2 = ''' + @ID + ''') as user1 at Instance2
您的查询不受益于Instance2上任何潜在的预优化。 因此,我build议在Instance2上创build一个存储过程,这样您就可以从运行时优化查询中受益,并且还可以使用您希望放置在查询中的所有优化提示。 所以在Instance2上,你可以创build一个像这样的过程( 再次注意,我假设了整数数据types ):
CREATE PROCEDURE user1.UpdateC (@val1 int, @val2 int, @ID int) AS BEGIN UPDATE C WITH (ROWLOCK) SET col1 = @val1, col2 = @val2 WHERE col2 = @ID END
然后,你的本地脚本可以用下面的代码replace上面第一部分的修正代码( 同样,假设是整数 ):
EXECUTE ('EXECUTE user1.UpdateC ' + @val1 + ', ' + @val2 + ', ' + @ID) AS user1 AT Instance2
链接的服务器安全上的MSDN: http : //msdn.microsoft.com/en-us/library/ms175537.aspx
为委派configuration链接的服务器: http : //msdn.microsoft.com/en-us/library/ms189580.aspx
类似的问题给你(我相信): http : //dbaspot.com/forums/ms-sqlserver/173869-access-remote-server-denied-because-current-security-context-not-trusted-sqlstate-42000-error -15274-A-2.HTML
SQL Server Central上的另一个解决scheme: http : //www.sqlservercentral.com/Forums/Topic476794-149-1.aspx