2008-09-18 48 views
25

Có ai biết SQL Server xác định trình kích hoạt thứ tự (cùng loại, tức là trước khi trình kích hoạt) được thực thi hay không. Và có cách nào để thay đổi điều này để tôi có thể chỉ định thứ tự tôi muốn. Nếu không, tai sao không.Trình kích hoạt SQL Server - thứ tự thực hiện

Cảm ơn.

Trả lời

2

Thứ tự được đặt bởi máy chủ sql, điều duy nhất bạn có thể làm là sử dụng hệ thống sp (sp_settriggerorder) để đặt trình kích hoạt sẽ kích hoạt trước và kích hoạt sẽ kích hoạt lần cuối.

Ngoài việc đặt trình kích hoạt đầu tiên và cuối cùng để kích hoạt, bạn không thể sửa đổi hoặc cho biết máy chủ sql thứ tự nào sẽ sử dụng. Do đó, bạn sẽ muốn xây dựng trình kích hoạt của mình để chúng không dựa vào thứ tự chúng được kích hoạt. Ngay cả khi bạn xác định thứ tự mà họ bắn vào hôm nay, nó có thể thay đổi vào ngày mai.

Thông tin này dựa trên Sql Server 2000, tuy nhiên tôi không tin rằng 2005/2008 hành động khác về vấn đề này.

4

Sử dụng thủ tục được lưu trữ sp_Settriggerorder, bạn có thể xác định thứ tự thực hiện của trình kích hoạt.

sp_settriggerorder [ @triggername = ] ‘[ triggerschema. ] triggername’ 
, [ @order = ] ‘value’ 
, [ @stmttype = ] ’statement_type’ 
[ , [ @namespace = ] { ‘DATABASE’ | ‘SERVER’ | NULL } ] 

Tham số thứ hai, "thứ tự" có thể có ba giá trị có nghĩa là nó có thể tính đến tối đa ba trình kích hoạt.

  1. Đầu - Trigger là bắn đầu tiên
  2. cuối - Trigger là bắn cuối cùng
  3. Không - Trigger là bắn theo thứ tự ngẫu nhiên.
1

Sử dụng hệ thống này thủ tục lưu trữ:

sp_settriggerorder[@triggername = ] 'triggername', [@order = ] 'value', [@stmttype = ] 'statement_type' 
5

sp_settriggerorder chỉ áp dụng cho SAU gây nên.

4

Bạn có thể đảm bảo trình kích hoạt nào được kích hoạt trước, kích hoạt nào được kích hoạt trước và kích hoạt nào kích hoạt ở giữa bằng cách sử dụng sp_settriggerorder. Nếu bạn cần đồng bộ hóa nhiều hơn ba, nó không xuất hiện trong SQL Server 2005.

Đây là mẫu được lấy từ here (Bài viết được liên kết có nhiều thông tin hơn).

sp_settriggerorder [ @triggername = ] ‘[ triggerschema. ] triggername’ 
, [ @order = ] ‘value’ 
, [ @stmttype = ] ’statement_type’ 
[ , [ @namespace = ] { ‘DATABASE’ | ‘SERVER’ | NULL } ] 
10

Nếu bạn lo lắng về lệnh kích hoạt thì bạn nên lùi lại và xem xét những gì bạn đang cố gắng làm và nếu có cách nào tốt hơn. Thực tế rằng đây không phải là một điều dễ dàng để thay đổi nên nói với bạn điều gì đó.

Trình kích hoạt luôn trông giống như một giải pháp thực sự gọn gàng, và ở đúng nơi chúng rất có giá trị, nhưng giá cao, thật dễ dàng để tạo ra những cơn ác mộng gỡ lỗi với chúng. Tôi đã mất nhiều giờ trong quá khứ cố gắng để gỡ lỗi một số hành vi cơ sở dữ liệu tối nghĩa chỉ để tìm nguyên nhân được burrowed đi trong một kích hoạt bỏ qua.

17

Sử dụng SetTriggerOrder là tốt, nhưng nếu mã của bạn phụ thuộc vào một chuỗi cụ thể thực hiện, tại sao không quấn tất cả trigger của bạn thành các thủ tục lưu trữ, và có một cuộc gọi đầu tiên thứ hai, thứ hai gọi thứ ba vv

Sau đó, bạn chỉ cần thực hiện lệnh đầu tiên trong trình kích hoạt.

Một người nào đó trong tương lai sẽ biết ơn rằng họ không phải đào bới xung quanh trong bảng hệ thống để xác định trình tự thực hiện tùy chỉnh.

+7

Nói chung chúng tôi không làm điều này vì chúng tôi không có quyền truy cập dễ dàng vào các ký tự giả được chèn và đã xóa trong các thủ tục được lưu trữ. – mwigdahl

+0

Thứ tự thực hiện có thể thú vị mà không phụ thuộc ... – Paul

14

Bạn có thể sử dụng sp_settriggerorder để xác định thứ tự của từng trình kích hoạt trên bảng.

Tuy nhiên, tôi cho rằng bạn sẽ tốt hơn khi có một trình kích hoạt duy nhất thực hiện nhiều việc. Đây là đặc biệt là vì vậy nếu thứ tự quan trọng, vì tầm quan trọng đó sẽ không rõ ràng nếu bạn có nhiều trình kích hoạt. Hãy tưởng tượng ai đó đang cố gắng hỗ trợ cơ sở dữ liệu hàng tháng/năm xuống theo dõi. Tất nhiên có khả năng là trường hợp bạn cần phải có nhiều bộ kích hoạt hoặc nó thực sự là thiết kế tốt hơn, nhưng tôi sẽ bắt đầu giả sử bạn nên có một và làm việc từ đó.

1

Một tuyên bố triệu USD trong bối cảnh này -

sp_settriggerorder: Chỉ định SAU trigger được bắn đầu tiên hoặc cuối cùng. Các trình kích hoạt SAU được kích hoạt giữa lần kích hoạt đầu tiên và cuối cùng là được thực thi theo thứ tự không xác định.

Nguồn: MSDN

2

Sử dụng này:

Ví dụ:

USE AdventureWorks; 
GO 
EXEC sys.sp_settriggerorder @triggername = N'', -- nvarchar(517) 
    @order = '', -- varchar(10) 
    @stmttype = '', -- varchar(50) 
    @namespace = '' -- varchar(10) 

The First và trigger cuối phải hai trigger khác nhau.

Đầu tiên: Trình kích hoạt được kích hoạt trước.

Cuối cùng: Trình kích hoạt được kích hoạt lần cuối.

Không có: Trình kích hoạt được kích hoạt theo thứ tự không xác định.

Và xem liên kết này cho giá trị của @stmttype: DDL Events

Và đối với @namespace = { 'DATABASE' | 'SERVER' | NULL} và để biết thêm thông tin, hãy xem: DDL Triggers

Các vấn đề liên quan