在存储过程中创建和销毁链接服务器

时间:2014-11-19 22:03:23

标签: sql sql-server tsql

我有一个存储过程需要触摸两个不同服务器上的某些数据。其中一个服务器包含一些敏感信息,我们宁愿不让这个服务器始终链接到另一个服务器。

为了解决这个问题,我编写了调用链接并将服务器直接销毁到存储过程中,如下所示:

IF NOT EXISTS (
        SELECT NAME
        FROM sys.servers
        WHERE NAME = 'TIMECLOCK'
        )
    EXEC sys.sp_addlinkedserver @server = 'TIMECLOCK'
        ,@srvproduct = 'SQL Server';

/* a select statement */
EXEC sys.sp_dropserver [TIMECLOCK]

但是,有时(但不是所有的时间!)当我运行它时,它会抛出一个错误,告诉我它在TIMECLOCK中找不到sys.servers服务器。这种不一致让我感到困惑,因为我尝试了很多场景(在运行程序之前有或没有实例化链接),并且它们都在70%的时间内工作。

知道可能导致这种情况的原因吗?

2 个答案:

答案 0 :(得分:1)

  

其中一个服务器包含一些敏感信息,我们   宁愿不要让这台服务器一直挂在另一台服务器上。

垃圾。如果您确实关心安全性,那么您应该加强安全性并完成它,而不是为想象中的问题选择最糟糕的解决方案。

话虽如此,还有专门为此目的而设计的链接服务器的替代方案 - 当您必须查询外部数据但不想创建持久链接时。这些是opendatasourceopenrowset。你可以选择你最喜欢的任何一个。

答案 1 :(得分:0)

我同意Roger Wolf所表达的观点。

但是,如果必须这样做,可以将代码括在while循环中。它效率不高,但它会保证如果添加链接服务器失败,它会在尝试访问它之前继续尝试。

因此,而不是IF NOT EXISTS(),而不是EXISTS()。