这是我遇到的问题。我正在尝试创建一个将部署到DEV,QA和PROD环境的存储过程。由于对部署过程的严格要求,我必须在所有三种环境中确保我的处理顺序并且必须工作(当然!)。问题是此proc引用了不同数据库中的表。在DEV和QA中这是可以的,因为数据库在同一服务器上,但是在PROD中,所讨论的数据库位于单独的服务器上。以下是我的proc中的代码片段,它试图处理不同的环境问题:
IF @@SERVERNAME<>'Production'
BEGIN
select distinct m.acct_id
from l_map m (nolock)
join #llist ll on ll.acct_id = m.acct_id
where ll.acct_id not in (select l_number from [OTHERDATABASE].[dbo].[OTHERTABLE] where lmi_status_code not in (select item from #ruleItems))
END
ELSE
BEGIN
select distinct m.acct_id
from l_map m (nolock)
join #llist ll on ll.acct_id = m.acct_id
where ll.acct_id not in (select l_number from [OTHERSERVER].[OTHERDATABASE].[dbo].[OTHERTABLE] where lmi_status_code not in (select item from #ruleItems))
END
我的proc是从一个不同的proc中调用的。当我直接测试上述逻辑时,我得到了我期望的结果。但是,当我尝试在DEV或QA(从顶级proc)的上下文中测试它时,我收到一条错误,指出找不到[OTHERSERVER]。我不能(也不需要)在DEV和QA中创建链接服务器,但我需要能够在PROD环境中使用链接服务器。有谁知道如何做到这一点?
答案 0 :(得分:0)
我的建议是在链接服务器的表上创建一个视图。在测试服务器上,您可以使用测试数据在本地表上创建视图。
通过这种方式,有关链接服务器的信息将被隔离到视图中。然后,您可以编写引用该视图的存储过程或其他查询,而不是直接引用链接服务器。
请注意,这不会使您测试所需的安全性和权限,只会使查询与架构一起使用。
答案 1 :(得分:0)
答案 2 :(得分:0)
I have the same situation. Using an alias, I can not use OpenQuery that I need to execute functions with parameters on the destination server, where a simple SELECT INTO or EXECUTE was not possible.
Using EXEC will return (using my configuration) in error Msg 7411:
Server 'linked_server_name' is not configured for RPC.
Here is an example of my approach using a string query. Note that on testing I don't use linked server but you can use one if you need:
-- Prepare Source Query Fragment
IF @@SERVERNAME = 'production_server'
SET @SelectQuery = ' OPENQUERY (['
+ @SourceServer + '],''EXEC [production_source_db].[schema_name].['
+ @FuncrionName+'] '''''
+ @param_1 + ''''', '''''
+ @param_2 + ''''''')';
ELSE
SET @SelectQuery = ' EXEC [testing_schema].['
+ @FuncrionName+'] '''
+ @param_1 + ''', '''
+ @param_2 + ''')';
-- Prepare Destination Query Fragment
IF @@SERVERNAME = 'production_server'
SET @Destination = '[production_destination_server].[production_destination_db].[schema_name]';
ELSE
SET @Destination = '[testing_schema]';
-- Execute the data transfer
EXEC ('
INSERT INTO ' + @Destination + '.[Destination_Table] (
[Col1]
, [Col2])
SELECT
[Col1]
, [Col2]
FROM ' + @SelectQuery )