Я работаю с довольно большой программной платформой, которая использует Microsoft SQL Server 2008 R2. Я исследую очень редкую ошибку, когда что-то в базе данных обновляет первичный ключ (CID) ContactInfo
до 0. В таблице есть два первичных ключа. CID связан с первичным ключом в другой таблице для хранения контактной информации.
Есть ли способ сделать существующий захват триггера обновления, какой хранимой процедурой выполняется обновление таблицы? Или, что еще лучше, есть ли способ записи данных Profiler в таблицу аудита, например оператор выполнения хранимой процедуры с входными параметрами? Мы могли бы непрерывно запускать трассировку Profiler, чтобы попытаться перехватить обновление в режиме реального времени, но нечастая ошибка привела бы к сохранению как минимум нескольких сотен гигабайт данных трассировки, что не вариант.
Ниже приведен мой код для существующей таблицы аудита. Есть 28 столбцов, поэтому я просто заменил их на [столбцы] для простоты и пространства.
ALTER TRIGGER [dbo].[wt_ContactInfo_U]
ON [dbo].[ContactInfo]
FOR UPDATE AS
INSERT INTO [dbo].[ContactInfo_AUDIT] ( // columns )
SELECT // columns
FROM Deleted D
WHERE
CHECKSUM( // D.[columns]) NOT IN (SELECT CHECKSUM( // I.[columns])
FROM INSERTED I
WHERE I.[CID] = D.[CID])