Как я могу условно использовать связанный сервер в зависимости от среды, в которой в данный момент выполняется хранимый процесс? - PullRequest
1 голос
/ 17 марта 2011

Вот проблема, с которой я столкнулся. Я пытаюсь создать хранимый процесс, который будет развернут в средах DEV, QA и PROD. Из-за строгих требований к процессу развертывания я должен убедиться, что мой процесс работает одинаково во всех трех средах и должен работать (конечно!). Проблема в том, что этот процесс ссылается на таблицу в другой базе данных. В DEV и QA это нормально, потому что база данных находится на одном сервере, однако в PROD соответствующая база данных расположена на отдельном сервере. Ниже приведен фрагмент кода из моего процесса, который пытается решить различные проблемы среды:

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

Мой процесс вызывается из другого процесса. Когда я тестирую вышеупомянутую логику напрямую, я получаю ожидаемые результаты. Однако, когда я пытаюсь протестировать его в контексте в DEV или QA (из proc верхнего уровня), я получаю сообщение об ошибке, что [OTHERSERVER] не может быть найден. Я не могу (и не должен) создавать связанный сервер в DEV и QA, но мне нужно иметь возможность использовать связанный сервер в среде PROD. Кто-нибудь знает, как этого добиться?

Ответы [ 3 ]

0 голосов
/ 17 марта 2011

Используйте синонимы, см. Здесь .

Также см. Эти два примера SO: one , two .

Определение синонима включенокаждый сервер может быть (есть) разным, но код (хранимая процедура) не меняется.

0 голосов
/ 12 октября 2017

У меня такая же ситуация.Используя псевдоним, я не могу использовать OpenQuery, который мне нужен для выполнения функций с параметрами на целевом сервере, где простое SELECT INTO или EXECUTE было невозможно.

Использование EXEC вернет (используя мою конфигурацию) сообщение об ошибке 7411:

Сервер 'имя_связи_сервера' не настроен для RPC.

Вот пример моего подхода с использованием строкового запроса.Обратите внимание, что при тестировании я не использую связанный сервер, но вы можете использовать его, если вам нужно:

-- 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 )
0 голосов
/ 17 марта 2011

Мое предложение - создать представление таблицы на связанном сервере.На вашем тестовом сервере вы можете создать представление локальной таблицы с тестовыми данными.

Таким образом, информация о связанном сервере изолируется от представления.Затем вы можете написать свой хранимый процесс или другие запросы, ссылающиеся на представление, а не ссылаться на связанный сервер напрямую.

Обратите внимание, что это не позволит вам протестировать безопасность и необходимые вам разрешения, только то, что запрос работает ссхема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...