Существует ли способ отключить триггер SQL Server для просто конкретного объема выполнения?

В 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" в моей таблице и выполнении a NoTrigger = null, потому что я хотел бы сохранить таблицу как можно меньше.

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

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

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

36
задан marc_s 13 September 2019 в 10:29
поделиться

8 ответов

Я просто видел эту статью, недавно выделенную на SQL Server Центральная новостная рассылка, и это, кажется, предлагает способ, которым можно найти полезное использование Context_Info на соединении:

http://www.mssqltips.com/tip.asp?tip=1591

<час>

РЕДАКТИРОВАНИЕ Водяной черепахой:

вышеупомянутая ссылка включает следующий код:

USE AdventureWorks;  
GO  
-- creating the table in AdventureWorks database  
IF OBJECT_ID('dbo.Table1') IS NOT NULL  
DROP TABLE dbo.Table1  
GO  
CREATE TABLE dbo.Table1(ID INT)  
GO   
-- Creating a trigger  
CREATE TRIGGER TR_Test ON dbo.Table1 FOR INSERT,UPDATE,DELETE  
AS  
DECLARE @Cinfo VARBINARY(128)  
SELECT @Cinfo = Context_Info()  
IF @Cinfo = 0x55555  
RETURN  
PRINT 'Trigger Executed'  
-- Actual code goes here  
-- For simplicity, I did not include any code  
GO  

, Если Вы хотите препятствовать тому, чтобы триггер был выполнен, можно сделать следующее:

SET Context_Info 0x55555 
INSERT dbo.Table1 VALUES(100)
58
ответ дан Seibar 27 November 2019 в 05:41
поделиться

ALTER TABLE tbl ОТКЛЮЧАЕТ ТРИГГЕРНЫЙ trg

http://doc.ddart.net/mssql/sql70/aa-az_5.htm

, я не понимаю значение Вашего 1-го абзаца хотя

4
ответ дан devio 27 November 2019 в 05:41
поделиться

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

я предлагаю отклонить полномочия обновления таблицы, если ничто иное не работает.

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

6
ответ дан Jeffrey L Whitledge 27 November 2019 в 05:41
поделиться

Так как Вы указываете, что триггер содержит логику для обработки всех обновлений, даже ручных обновлений, тогда это должно быть то, где логика находится. Пример, который Вы упоминаете, где хранимая процедура "будет заботиться об этой логике", подразумевает дублирующий код. Кроме того, если Вы хотите быть уверенными, что каждый оператор UPDATE имеет эту логику, примененную независимо от автора, тогда триггер является местом для него. Что происходит, когда кто-то создает процедуру, но забывает копировать логику все снова и снова? Что происходит, когда пора изменить логику?

2
ответ дан Pittsburgh DBA 27 November 2019 в 05:41
поделиться

Не отключайте триггер. Вы корректны, который отключит для любых параллельных транзакций.

, Почему Вы хотите отключить триггер? Что это делает? ПОЧЕМУ является триггер casuing проблемой? Это обычно - плохая идея отключить тигра с точки зрения целостности данных.

1
ответ дан HLGEM 27 November 2019 в 05:41
поделиться

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

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

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

1
ответ дан Rob Allen 27 November 2019 в 05:41
поделиться

Полагайте, что перезапись триггера улучшает производительность, если производительность является проблемой.

1
ответ дан HLGEM 27 November 2019 в 05:41
поделиться

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

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

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

0
ответ дан Jason Jackson 27 November 2019 в 05:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: