使用对称密钥/证书的加密数据的链接服务器查询

时间:2016-04-21 01:37:16

标签: sql sql-server tsql sql-server-2012

我想如果我不得不把它归结为一件事,真正的问题是:" 有没有办法使用某种4部分标识符语法 - 等同于调用密钥和证书并保持打开,以便4部分标识符SELECT声明可以使用使用链接服务器"

所有服务器都是 SQL Server 2012

当我在SSMS中登录服务器(SERVER_A)时(此服务器具有加密数据),我只需OPEN SYMMETRIC KEYDECRYPTION WITH证书,然后用DECRYPTWITHKEY并继续前进。

SSMS中的SERVER_A查询:

OPEN SYMMETRIC KEY [KEY]
DECRYPTION WITH [CERTIFICATE]
GO

SELECT
    CONVERT(NVARCHAR, DECRYPTWITHKEY(col)) AS ColA
FROM
    SCHEMA.TABLE
GO

我有另一台服务器(SERVER_B)与SERVER_A的链接服务器连接。从SERVER_B开始,我希望能够在句法上做同样的事情,但我没有运气。

我成功使用EXEC [SERVER_A].DATABASE.dbo.sp_executesql N'<above code>'并启用了RPC,但此方法需要转义撇号,我失去了智能感知和代码的整体可维护性/可读性(这明显比上面的例子)。

有没有办法做类似以下的事情:

理想 SERVER_B查询&#34;表单&#34;在SSMS:

OPEN SYMMETRIC KEY [SERVER_A].DATABASE.[KEY]
DECRYPTION WITH [SERVER_A].DATABASE.[CERTIFICATE]
GO

SELECT
    CONVERT(NVARCHAR, DECRYPTWITHKEY(col)) AS ColA
FROM
    [SERVER_A].DATABASE.SCHEMA.TABLE
GO

或者至少,保持密钥打开,以便我可以使用4部分标识符语法SELECT语句(即,不将整个事物包装在OPENQUERY中,我已经完成并工作,但我不想引用整个查询)?对于更好或更差的练习/性能,实际的SELECT语句从内部网上的3个不同服务器调用数据,因此4部分标识符语法非常方便,可读性。

2 个答案:

答案 0 :(得分:0)

我知道这是一篇旧帖子,但只是遇到了相同的情况,并使用OPENQUERY

使用以下查询来实现这一点
SELECT * FROM OPENQUERY( [SERVER_A], '
            EXEC ('' USE [DATABASE];

                    OPEN SYMMETRIC KEY [KEY]
                    DECRYPTION BY CERTIFICATE [CERTIFICATE]

                    SELECT
                        CONVERT(NVARCHAR, DECRYPTWITHKEY(col)) AS ColA
                    FROM
                        SCHEMA.TABLE
                '') 
                ')

答案 1 :(得分:0)

对于需要参数的查询,以下内容对我有用-

declare @param nvarchar(20)
set @param = 'param value'
declare @qSQL nvarchar(1000)
SET @qSQL = '
    SELECT
        *
    FROM
    OPENQUERY([Linked_Server],''        
        EXEC ('''' USE [Database_Name];

                open symmetric key key_name
                decryption by certificate cert_name;

                SELECT
                    *
                FROM
                    [Table_Name]
                where CONVERT(varchar(Max), DECRYPTBYKEY(Column_Name))) = '''''''''+@param+'''''''''
            '''') 
    '');';

EXEC sp_executesql @qSQL;