Отказ от ответственности: я не могу реализовать это должным образом в приложении, так как приложение, над которым я работаю, не обеспечивает доступ к данным согласованным образом, и усилия по рефакторингу были бы слишком велики для масштаба проекта и предстоящего срок.
Как мне поступить с реализацией триггера SQLCLR для аудита? Я бы хотел, чтобы он был настолько простым, насколько это возможно, и как можно более легким для удаления и замены надлежащей реализацией позже.
Я планирую записать свой аудит в одну таблицу (база данных не очень тяжелая для записи), имеющую такие столбцы, как:
- Метка времени (
datetime
) - когда произошло изменение?
- Имя пользователя (
varchar
) - кто внес изменение?
- AfferedTableName (
varchar
) - какая таблица была затронута?
- ActedRowKey (
varchar
) - это будет простой или составной ключ, например (Id=42
, A=4,B=2
)
- OperationType (
char(1)
) - либо I
, U
или D
для вставки, обновления и удаления соответственно.
- InsertedXml (
xml
) - сериализованная строка xml (SELECT * FROM INSERTED FOR XML AUTO
)
- DeletedXml (
xml
) - строка, сериализованная в xml (SELECT * FROM DELETED FOR XML AUTO
)
Я планирую запросить и преобразовать эти данные в удобочитаемую форму в приложении. Я планирую реализовать это как триггер базы данных, написанный с использованием SQLCLR. Я вижу 2 возможных подхода:
- Реализуйте это полностью как метод SqlTrigger:
- Реализуйте это как метод SqlProcedure с параметрами:
- deletedXml
Буду признателен за любую конструктивную критику и предложения. Мое ограничение заключается в том, что я должен осуществлять аудит на уровне базы данных с использованием триггеров, и я хочу, чтобы он был максимально поддерживаемым (читай: сменным и заменяемым), насколько это возможно. Также, в идеале, я не хочу иметь сотни триггеров с одинаковым телом на случай, если мне придется их модифицировать.