Короткая версия:
Кто-нибудь знает способ - внутри триггера 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 - определения, какой процесс изменил данные, и выхода из триггера, если обнаружен определенный процесс?
Спасибо, ребята!