Есть ли способ отключить триггер SQL Server только для определенной области выполнения? - PullRequest
35 голосов
/ 06 октября 2008

В SQL Server 2005 есть ли способ для триггера выяснить, какой объект отвечает за срабатывание триггера? Я хотел бы использовать это для отключения триггера для одной сохраненной процедуры.

Есть ли другой способ отключить триггер только для текущей транзакции? Я мог бы использовать следующий код, но если я не ошибаюсь, это также повлияет на параллельные транзакции - что было бы плохо.

DISABLE TRIGGER { [ schema_name . ] trigger_name [ ,...n ] | ALL } ON { object_name | DATABASE | ALL SERVER } [ ; ]

ENABLE TRIGGER { [ schema_name . ] trigger_name [ ,...n ] | ALL } ON { object_name | DATABASE | ALL SERVER } [ ; ]

Если возможно, я бы хотел избежать использования метода «NoTrigger» в моей таблице и выполнения NoTrigger = null, потому что я хотел бы, чтобы таблица была как можно меньше.

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

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

От: http://searchsqlserver.techtarget.com/tip/1,289483,sid87_gci1170220,00.html#trigger

Ответы [ 11 ]

0 голосов
/ 06 октября 2008

Я согласен с некоторыми другими ответами. Не отключайте триггер.

Это чистое мнение, но я избегаю триггеров, таких как чума. Я обнаружил очень мало случаев, когда триггер использовался для обеспечения соблюдения правил базы данных. В моем опыте есть очевидные крайние случаи, и у меня есть только мой опыт, чтобы сделать это заявление. Обычно я видел триггеры, используемые для вставки некоторых реляционных данных (что должно быть сделано из бизнес-логики), для вставки данных в таблицу отчетов, т.е. для денормализации данных (что можно сделать с помощью процесса вне транзакции), или для преобразования данных каким-то образом.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...