Điều gì có thể là mục đích của kích hoạt này?


7

Tôi vấp phải sự kích hoạt này khi cố gắng phân tích một số DB:

Create trigger [tbl_Details_Trigger] on [tbl_Details]
    Instead of Insert
    As
      Insert into [tbl_Details]
      Select * from inserted

Đối với tôi có vẻ như trình kích hoạt này không làm gì đặc biệt, và nếu nó bị loại bỏ thì kết quả sẽ giống nhau. Tôi có đúng không Tui bỏ lỡ điều gì vậy?



Tôi có thể nghĩ về 2 điều có thể khác với chèn ban đầu: thứ tự bị mất (nếu có) và có một điều khét tiếng *có thể phá vỡ chèn nếu bạn có một cột nhận dạng không thể chèn. Cả hai điều này đều tiêu cực vì vậy tôi không thể nghĩ ra lý do chính đáng để sử dụng điều này.
EzLo

@Ezlo - điểm tốt, mặc dù chèn thực sự bỏ qua ORDER BYmệnh đề , nếu nó được bao gồm trong INSERTtuyên bố.
Max Vernon

1
@MaxVernon điều tốt để chỉ ra, không biết rằng các hàng không được đặt hàng nếu không có cột nhận dạng hoặc TOP (một phần) và thật hợp lý khi bỏ qua nó.
EzLo

Câu trả lời:


3

Bạn nói đúng; vì trình kích hoạt này là trình INSTEAD OF INSERTkích hoạt chỉ đơn giản là chèn dữ liệu được chèn vào bảng, trình kích hoạt được xác định trên, kết quả duy nhất sẽ là chèn dữ liệu như thể trình kích hoạt không tồn tại.

Như với bất kỳ và tất cả các thay đổi, trước khi bạn xóa trình kích hoạt này trong sản xuất, hãy đảm bảo bạn kiểm tra sự thay đổi trong môi trường phát triển / thử nghiệm của mình.

Thật thú vị, nếu bảng bao gồm một IDENTITYcột, bạn sẽ không thể tạo trình kích hoạt. Hãy xem xét repro này, chạy trên SQL Server 2016+:

USE tempdb;
DROP TABLE IF EXISTS dbo.insert_test;
CREATE TABLE dbo.insert_test
(
    i int NOT NULL
        CONSTRAINT PK_insert_test
        PRIMARY KEY CLUSTERED
        IDENTITY(1,1)
    , d varchar(100) NOT NULL
);
GO
CREATE TRIGGER insert_test_trigger ON dbo.insert_test
INSTEAD OF INSERT
AS
BEGIN
    SET NOCOUNT ON;

    INSERT INTO dbo.insert_test (i, d)
    SELECT i, d
    FROM inserted;
END
GO

INSERT INTO dbo.insert_test (d)
VALUES ('test');

SELECT *
FROM dbo.insert_test;

Các kết quả:

Msg 544, Cấp 16, Trạng thái 1, Quy trình insert_test_trigger, Dòng 8 [Dòng bắt đầu 24]
Không thể chèn giá trị rõ ràng cho cột nhận dạng trong bảng 'insert_test' khi IDENTITY_INSERT được đặt thành TẮT.

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.