Làm thế nào để thay đổi thứ tự bắn của Triggers?


12

Thực sự tôi hiếm khi sử dụng kích hoạt. Vì vậy, tôi đã gặp một vấn đề lần đầu tiên. Tôi có rất nhiều bảng có kích hoạt (2 hoặc nhiều hơn cho mỗi bảng). Tôi muốn biết và thay đổi thứ tự kích hoạt bắn cho mỗi bảng. Có thể có được thông tin này?

THÊM:

Đây là một bài viết enoght tốt về mssqltips tôi đã tìm thấy.

Câu trả lời:


12

Bạn có thể sử dụng câu lệnh sau để liệt kê tất cả các kích hoạt trong mỗi bảng.

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

Một khi bạn tìm ra tất cả các kích hoạt. Bạn có thể tự thay đổi thứ tự bằng cách sử dụng sp_settriggerorder

văn bản thay thế


2
Không "sau đó" chỉ cho biết rằng trình kích hoạt được xác định là SAU <hành động> thay vì CÀI ĐẶT <hành động>, thay vì chỉ ra bất cứ điều gì về thứ tự thực hiện của hai hoặc nhiều trình kích hoạt cùng loại?
David Spillett

@David - vâng! bạn đã đúng
CoderHawk

12

IIRC bạn không thể đảm bảo chính xác thứ tự kích hoạt (với cùng định nghĩa về việc sẽ phản ứng với điều gì và khi nào) kích hoạt một hành động nhất định đối với bảng, đối với bất kỳ số lần kích hoạt nào.

Mặc dù vậy, bạn có thể sử dụng nếu có ba hoặc ít hơn, vì bạn có thể sử dụng sp_settriggerorder để đặt đầu tiên là đầu tiên, cuối cùng là cuối cùng và một ở giữa để có thứ tự "không xác định".

Nếu các kích hoạt của bạn nhạy cảm với thứ tự được thực hiện trong điều này thường chỉ ra rằng thiết kế của bạn đang trở nên phức tạp hơn mức cần thiết (thường là do tăng trưởng hữu cơ) và có thể được hưởng lợi từ một số tái cấu trúc.


+1 bạn đúng, tôi phải cấu trúc lại mã này (nó phức tạp và có liên kết chéo ...), nhưng tôi đang ở bước đầu tiên - điều tra.
garik

5
-- 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
  ;

1
Điều này có vẻ khá lắt léo. @garik, cái này có hoạt động trên môi trường của bạn không? (BTW, nhận xét SQL bắt đầu cũng phải là một phần của khối mã.)
Nick Chammas

1
@Nick bạn nói đúng. Tôi đang nhìn xung quanh nó trong vài phút.
garik

@Nick theo mặc định, các thuộc tính này là trống rỗng. vì vậy, nếu thực thi, ví dụ exec sp_settriggerorder @triggername = 'tr_xxx' , @order = 'Last' , @stmttype= 'DELETE'chúng ta có thể thấy kết quả ('X') trong kết quả truy vấn của Jackson. Cảm ơn, Jackson.
garik
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.