Тестирование соответствия связанного сервера внутри триггера или процедуры - PullRequest
1 голос
/ 29 мая 2009

Я написал триггер, который обновляет локальную таблицу и аналогичную таблицу на связанном сервере.

CREATE TRIGGER myTtableUpdate ON myTable<br> AFTER UPDATE AS<br> IF (COLUMNS_UPDATED() > 0)<br> BEGIN<br> DECLARE @retval int;<br> BEGIN TRY<br> EXEC @retval = sys.sp_testlinkedserver N'my_linked_server';<br> END TRY<br> BEGIN CATCH<br> SET @retval = sign(@@error);<br> END CATCH; </p> <p>IF (@retval = 0)<br> BEGIN<br> UPDATE remoteTable SET remoteTable.datafield = i.datafield<br> FROM my_linked_server.remote_database.dbo.myTable remoteTable<br> INNER JOIN inserted i ON (remoteTable.id = i.id)<br> END<br> END -- end of trigger

К сожалению, когда соединение не работает, я получаю сообщение об ошибке
'Сообщение 3616, Уровень 16, Состояние 1, Строка 2'
'Транзакция обречена на триггер. Пакет был прерван '
и локально сделанное обновление откатывается.

Есть ли способ сохранить эту ошибку и сохранить локальные обновления?
Обратите внимание, что я использую SQL Server 2005 Express Edition на обоих компьютерах под управлением Windows XP Pro.

edit1: SQL-сервер Express Edition
edit2: оба компьютера работают под управлением Windows XP Pro, так что это не серверы

Ответы [ 2 ]

1 голос
/ 29 мая 2009

не записывать на удаленный сервер в триггере.

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

это задание может запускать процедуру, которая может проверять соединение, и при резервном копировании оно будет обрабатывать все строки в новой локальной таблице. Он может обрабатывать строки в локальной таблице следующим образом:

declare @OutputTable table (RowID int not null)

insert into my_linked_server.remote_database.dbo.myTable remoteTable(...columns...)
    OUTPUT INSERTED.RowID
    INTO @OutputTable
    SELECT ...columns...
        from NewLocalTable

delete NewLocalTable
   from NewLocalTable           n
       inner join @OutputTable  o ON n.RowID=o.RowID

РЕДАКТИРОВАТЬ на основе OP комментарий
после вставки в эту новую локальную таблицу запустите задание из триггера (sp_start_job), оно будет выполняться в собственной области видимости. Если вы не можете использовать задания сервера SQL, используйте xp_cmdshell для выполнения хранимой процедуры (ищите SQLCMD или ISQL или OSQL, я не уверен, что у вас есть). по-прежнему планируйте задание каждые N минут, поэтому оно будет запускаться при установлении соединения.

0 голосов
/ 29 мая 2009

Это хотя бы один из серверов Workgroup версии или выше? Вы можете использовать Service Broker для отправки своих записей вместо связанных серверов, но он не будет работать между выпусками Express из-за лицензионных ограничений. Это решение, основанное исключительно на SQL, обеспечивает надежность в случае инцидентов (один из серверов недоступен), и ваши обновления будут распространяться в режиме реального времени (как только они будут зафиксированы). На моем сайте есть много примеров того, как это сделать, вы можете начать с этой статьи здесь , как добиться высокой пропускной способности сообщений .

...