Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

SQL Server - sau khi chèn trình kích hoạt - cập nhật một cột khác trong cùng một bảng

Nó phụ thuộc vào mức đệ quy cho các trình kích hoạt hiện được đặt trên DB.

Nếu bạn làm điều này:

SP_CONFIGURE 'nested_triggers',0
GO
RECONFIGURE
GO

Hoặc cái này:

ALTER DATABASE db_name
SET RECURSIVE_TRIGGERS OFF

Trình kích hoạt ở trên sẽ không được gọi lại và bạn sẽ an toàn (trừ khi bạn gặp phải một số loại bế tắc; điều đó có thể xảy ra nhưng có lẽ tôi đã nhầm).

Tuy nhiên, tôi không nghĩ rằng đây là một ý tưởng tốt. Một tùy chọn tốt hơn sẽ là sử dụng INSTEAD OF trigger . Bằng cách đó, bạn sẽ tránh thực hiện bản cập nhật đầu tiên (thủ công) qua DB. Chỉ cái được xác định bên trong trình kích hoạt mới được thực thi.

Trình kích hoạt INSTEAD OF INSERT sẽ giống như sau:

CREATE TRIGGER setDescToUpper ON part_numbers
INSTEAD OF INSERT
AS
BEGIN
    INSERT INTO part_numbers (
        colA,
        colB,
        part_description
    ) SELECT
        colA,
        colB,
        UPPER(part_description)
    ) FROM
        INSERTED
END
GO

Điều này sẽ tự động "thay thế" câu lệnh INSERT ban đầu bằng câu lệnh này, với lệnh gọi UPPER rõ ràng được áp dụng cho part_description trường.

Trình kích hoạt INSTEAD OF UPDATE sẽ tương tự (và tôi không khuyên bạn nên tạo một trình kích hoạt duy nhất, hãy tách chúng ra).

Ngoài ra, địa chỉ này đề cập đến nhận xét @Martin:nó hoạt động với nhiều lần chèn / cập nhật (ví dụ của bạn thì không).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server 2005 Cascading Delete

  2. SQL Chọn giá trị bên trong dấu ngoặc đơn

  3. Mối quan hệ sql khóa chính tổng hợp

  4. Tham gia đến MAX bản ghi ngày trong nhóm

  5. EntityFramework ConnectionString utf8