Вопрос

Дейли я редко использую триггеры. Поэтому я впервые встретил проблему. У меня много столов с триггерами (2 или более для каждой таблицы). Я хотел бы знать и изменить порядок триггеров стрельбы за каждую таблицу. Можно ли получить эту информацию?

ДОБАВЛЕН:

Вот хороший enght Статья о MSSQLTIPS Я нашел.

Это было полезно?

Решение

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

EXEC sp_MSForEachTable 'PRINT ''?'' 
EXEC sp_helptrigger ''?'''

Как только вы узнаете все триггеры. Вы можете вручную изменить заказ, используя sp_settriggerorder

alt text

Другие советы

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

Вы можете, хотя, если их три или меньше, как вы можете использовать sp_settriggerorder Чтобы установить первое первым, последним, чтобы быть последним, и тот, который посередине имел «неопределенный» порядок.

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

-- List tables with triggers and their firing order.  By Jackson Jarvis.
SELECT [tbl].[name] AS 'Table'
      ,[trg].[name] AS 'Trigger'
      ,CASE OBJECTPROPERTY([trg].[id] ,'ExecIsFirstInsertTrigger')
            WHEN 0 THEN ''
            ELSE 'X'
       END AS 'Insert First'
      ,CASE OBJECTPROPERTY([trg].[id] ,'ExecIsLastInsertTrigger')
            WHEN 0 THEN ''
            ELSE 'X'
       END AS 'Insert Last'
      ,CASE OBJECTPROPERTY([trg].[id] ,'ExecIsFirstUpdateTrigger')
            WHEN 0 THEN ''
            ELSE 'X'
       END AS 'Update First'
      ,CASE OBJECTPROPERTY([trg].[id] ,'ExecIsLastUpdateTrigger')
            WHEN 0 THEN ''
            ELSE 'X'
       END AS 'Update Last'
      ,CASE OBJECTPROPERTY([trg].[id] ,'ExecIsFirstDeleteTrigger')
            WHEN 0 THEN ''
            ELSE 'X'
       END AS 'Delete First'
      ,CASE OBJECTPROPERTY([trg].[id] ,'ExecIsLastDeleteTrigger')
            WHEN 0 THEN ''
            ELSE 'X'
       END AS 'Delete Last'
  FROM            [sysobjects] AS [trg] WITH (NOLOCK)
       INNER JOIN [sysobjects] AS [tbl] WITH (NOLOCK)
            ON  [trg].[parent_obj] = [tbl].[id]
  WHERE [trg].[TYPE] IN (N'TR')
  ORDER BY
       [tbl].[name] ASC
      ,[trg].[name] ASC
  ;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с dba.stackexchange
scroll top