Как определить имя процесса, вызвавшего срабатывание триггера - PullRequest
2 голосов
/ 26 апреля 2011

Короткая версия: Кто-нибудь знает способ - внутри триггера SQL 2000 - определения, какой процесс изменил данные, и выхода из триггера, если обнаружен определенный процесс?

Длинная версия У меня есть настроенная подпрограмма синхронизации, которая перемещает данные назад и вперед между несходными схемами базы данных.

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

Когда данные изменяются в одной из соответствующих таблиц, срабатывает триггер, который записывает PK этой записи в таблицу «sync». Эта таблица «синхронизации» контролируется процессом (хранимым процессом), который будет последовательно захватывать PK и копировать связанные данные из базы данных A в базу данных B, делая необходимые преобразования.

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

В SQL 2005 и выше я использую следующий код в процессе синхронизации, чтобы идентифицировать себя:

SET CONTEXT_INFO 0xHexValueOfProcName

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

IF (CONTEXT_INFO() = 0xHexValueOfProcName)
BEGIN
--  print '## Process Sync Queue detected. This trigger is exiting! ##'
  return
END

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

Кто-нибудь знает способ - внутри триггера SQL 2000 - определения, какой процесс изменил данные, и выхода из триггера, если обнаружен определенный процесс?

Спасибо, ребята!

1 Ответ

1 голос
/ 27 апреля 2011

(По запросу Андрея я отвечаю на свой вопрос.)

Я положил это на верх моего триггера, работает как заклинание.

-- How to check context info in SQL 2000
IF ((select CONTEXT_INFO from master..sysprocesses where spid = @@SPID) = 0xHexValueOfProcName)
BEGIN
  print 'Sync Process Detected  --  Exiting!'
  return
END
...