我想如果我不得不把它归结为一件事,真正的问题是:" 有没有办法使用某种4部分标识符语法 - 等同于调用密钥和证书并保持打开,以便4部分标识符SELECT
声明可以使用使用链接服务器?"
所有服务器都是 SQL Server 2012 。
当我在SSMS中登录服务器(SERVER_A
)时(此服务器具有加密数据),我只需OPEN SYMMETRIC KEY
和DECRYPTION 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部分标识符语法非常方便,可读性。
答案 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;