Trigger sql la gi

Trigger trong SQL Server là các stored procedure đặc biệt được thực thi tự động để phản hồi với các đối tượng cơ sở dữ liệu, cơ sở dữ liệu và các sự kiện máy chủ. SQL Server cung cấp ba loại trigger:

Show
  • Trigger dữ liệu ngôn ngữ thao tác (Trigger DML) kích hoạt khi xảy ra sự kiện
    AS
    BEGIN
    0,
    AS
    BEGIN
    1 và
    AS
    BEGIN
    2 dữ liệu xảy ra trên bảng.
  • Trigger dữ liệu ngôn ngữ định nghĩa (Trigger DDL) kích hoạt khi xảy ra các câu lệnh
    AS
    BEGIN
    3,
    AS
    BEGIN
    4 và
    AS
    BEGIN
    5.
  • Trigger đăng nhập (Trigger  Logon) kích hoạt khi xảy ra các sự kiện
    AS
    BEGIN
    6.

Tạo trigger trong SQL Server

Trong phần này, bạn sẽ tìm hiểu cách sử dụng câu lệnh

AS
BEGIN
7 trong SQL Server để tạo một trigger mới.

Giới thiệu về câu lệnh CREATE TRIGGER trong SQL Server

Câu lệnh

AS
BEGIN
7 cho phép bạn tạo một trigger mới sẽ được kích hoạt tự động bất cứ khi nào một sự kiện như
AS
BEGIN
0,
AS
BEGIN
2 hoặc
AS
BEGIN
1 xảy ra đối với một bảng.

Sau đây minh họa cú pháp của câu lệnh

AS
BEGIN
7:

CREATE TRIGGER [schema_name.]trigger_name
ON table_name
AFTER  {[INSERT],[UPDATE],[DELETE]}
[NOT FOR REPLICATION]
AS
{sql_statements}

Trong cú pháp này:

  • SET NOCOUNT ON;
    3 là tên của lược đồ mà trigger thuộc. Tên lược đồ là tùy chọn.
  • SET NOCOUNT ON;
    4 là tên do người dùng chỉ định cho trigger.
  • SET NOCOUNT ON;
    5 là bảng sẽ áp dụng trigger.
  • Sự kiện kích hoạt trigger được liệt kê trong câu lệnh
    SET NOCOUNT ON;
    6. Sự kiện này có thể là
    SET NOCOUNT ON;
    7,
    SET NOCOUNT ON;
    8 hoặc
    SET NOCOUNT ON;
    9. Một trigger có thể kích hoạt với một hoặc nhiều sự kiện xảy ra trên bảng.
  • Tùy chọn
    INSERT INTO production.product_audits
    (
        product_id,
        product_name,
        brand_id,
        category_id,
        model_year,
        list_price,
        updated_at,
        operation
    )
    SELECT
        i.product_id,
        product_name,
        brand_id,
        category_id,
        model_year,
        i.list_price,
        GETDATE(),
        'INS'
    FROM
        inserted AS i
    UNION ALL
    SELECT
        d.product_id,
        product_name,
        brand_id,
        category_id,
        model_year,
        d.list_price,
        getdate(),
        'DEL'
    FROM
        deleted AS d;
    0 chỉ thị SQL Server không được kích hoạt trigger khi sửa đổi dữ liệu được thực hiện như một phần của quá trình sao chép.
  • INSERT INTO production.product_audits
    (
        product_id,
        product_name,
        brand_id,
        category_id,
        model_year,
        list_price,
        updated_at,
        operation
    )
    SELECT
        i.product_id,
        product_name,
        brand_id,
        category_id,
        model_year,
        i.list_price,
        GETDATE(),
        'INS'
    FROM
        inserted AS i
    UNION ALL
    SELECT
        d.product_id,
        product_name,
        brand_id,
        category_id,
        model_year,
        d.list_price,
        getdate(),
        'DEL'
    FROM
        deleted AS d;
    1 là một hoặc nhiều câu lệnh Transact-SQL được sử dụng để thực hiện các hành động sau khi một sự kiện xảy ra.

Các bảng ảo cho trigger: INSERTED và DELETED

SQL Server cung cấp hai bảng ảo đặc biệt cho trigger là bảng

INSERT INTO production.product_audits
(
    product_id,
    product_name,
    brand_id,
    category_id,
    model_year,
    list_price,
    updated_at,
    operation
)
SELECT
    i.product_id,
    product_name,
    brand_id,
    category_id,
    model_year,
    i.list_price,
    GETDATE(),
    'INS'
FROM
    inserted AS i
UNION ALL
SELECT
    d.product_id,
    product_name,
    brand_id,
    category_id,
    model_year,
    d.list_price,
    getdate(),
    'DEL'
FROM
    deleted AS d;
2 và
INSERT INTO production.product_audits
(
    product_id,
    product_name,
    brand_id,
    category_id,
    model_year,
    list_price,
    updated_at,
    operation
)
SELECT
    i.product_id,
    product_name,
    brand_id,
    category_id,
    model_year,
    i.list_price,
    GETDATE(),
    'INS'
FROM
    inserted AS i
UNION ALL
SELECT
    d.product_id,
    product_name,
    brand_id,
    category_id,
    model_year,
    d.list_price,
    getdate(),
    'DEL'
FROM
    deleted AS d;
3. SQL Server sử dụng các bảng này để thu thập dữ liệu của bản ghi đã sửa đổi trước và sau khi sự kiện xảy ra.

Bảng dưới đây cho thấy nội dung của bảng

INSERT INTO production.product_audits
(
    product_id,
    product_name,
    brand_id,
    category_id,
    model_year,
    list_price,
    updated_at,
    operation
)
SELECT
    i.product_id,
    product_name,
    brand_id,
    category_id,
    model_year,
    i.list_price,
    GETDATE(),
    'INS'
FROM
    inserted AS i
UNION ALL
SELECT
    d.product_id,
    product_name,
    brand_id,
    category_id,
    model_year,
    d.list_price,
    getdate(),
    'DEL'
FROM
    deleted AS d;
2 và
INSERT INTO production.product_audits
(
    product_id,
    product_name,
    brand_id,
    category_id,
    model_year,
    list_price,
    updated_at,
    operation
)
SELECT
    i.product_id,
    product_name,
    brand_id,
    category_id,
    model_year,
    i.list_price,
    GETDATE(),
    'INS'
FROM
    inserted AS i
UNION ALL
SELECT
    d.product_id,
    product_name,
    brand_id,
    category_id,
    model_year,
    d.list_price,
    getdate(),
    'DEL'
FROM
    deleted AS d;
3 trước và sau mỗi sự kiện:

Sự kiệnBảng INSERTED chứaBảng DELETED chứaINSERTCác bản ghi đã được insertTrốngUPDATECác bản ghi sau khi được updateCác bản ghi trước khi được updateDELETETrốngCác bản ghi đã được delete

Hãy xem một số ví dụ tạo trigger trong SQL Server. Chúng tôi sẽ sử dụng bảng

INSERT INTO production.product_audits
(
    product_id,
    product_name,
    brand_id,
    category_id,
    model_year,
    list_price,
    updated_at,
    operation
)
SELECT
    i.product_id,
    product_name,
    brand_id,
    category_id,
    model_year,
    i.list_price,
    GETDATE(),
    'INS'
FROM
    inserted AS i
UNION ALL
SELECT
    d.product_id,
    product_name,
    brand_id,
    category_id,
    model_year,
    d.list_price,
    getdate(),
    'DEL'
FROM
    deleted AS d;
6 trong cơ sở dữ liệu mẫu BikeStores để minh họa.

Trigger sql la gi

Ví dụ tạo bảng để ghi nhật ký thay đổi

Câu lệnh sau đây tạo một bảng có tên

INSERT INTO production.product_audits
(
    product_id,
    product_name,
    brand_id,
    category_id,
    model_year,
    list_price,
    updated_at,
    operation
)
SELECT
    i.product_id,
    product_name,
    brand_id,
    category_id,
    model_year,
    i.list_price,
    GETDATE(),
    'INS'
FROM
    inserted AS i
UNION ALL
SELECT
    d.product_id,
    product_name,
    brand_id,
    category_id,
    model_year,
    d.list_price,
    getdate(),
    'DEL'
FROM
    deleted AS d;
7 để ghi thông tin khi một sự kiện
SET NOCOUNT ON;
7 hoặc
SET NOCOUNT ON;
9 xảy ra đối với bảng
INSERT INTO production.product_audits
(
    product_id,
    product_name,
    brand_id,
    category_id,
    model_year,
    list_price,
    updated_at,
    operation
)
SELECT
    i.product_id,
    product_name,
    brand_id,
    category_id,
    model_year,
    i.list_price,
    GETDATE(),
    'INS'
FROM
    inserted AS i
UNION ALL
SELECT
    d.product_id,
    product_name,
    brand_id,
    category_id,
    model_year,
    d.list_price,
    getdate(),
    'DEL'
FROM
    deleted AS d;
6:

CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);

Bảng

INSERT INTO production.product_audits
(
    product_id,
    product_name,
    brand_id,
    category_id,
    model_year,
    list_price,
    updated_at,
    operation
)
SELECT
    i.product_id,
    product_name,
    brand_id,
    category_id,
    model_year,
    i.list_price,
    GETDATE(),
    'INS'
FROM
    inserted AS i
UNION ALL
SELECT
    d.product_id,
    product_name,
    brand_id,
    category_id,
    model_year,
    d.list_price,
    getdate(),
    'DEL'
FROM
    deleted AS d;
7 có tất cả các cột từ bảng
INSERT INTO production.product_audits
(
    product_id,
    product_name,
    brand_id,
    category_id,
    model_year,
    list_price,
    updated_at,
    operation
)
SELECT
    i.product_id,
    product_name,
    brand_id,
    category_id,
    model_year,
    i.list_price,
    GETDATE(),
    'INS'
FROM
    inserted AS i
UNION ALL
SELECT
    d.product_id,
    product_name,
    brand_id,
    category_id,
    model_year,
    d.list_price,
    getdate(),
    'DEL'
FROM
    deleted AS d;
6. Bên cạnh đó, nó được bổ sung thêm một vài cột để ghi lại những thay đổi ví dụ
CREATE TRIGGER production.trg_product_audit
ON production.products
AFTER INSERT, DELETE
AS
BEGIN
    SET NOCOUNT ON;
    INSERT INTO production.product_audits(
        product_id, 
        product_name,
        brand_id,
        category_id,
        model_year,
        list_price, 
        updated_at, 
        operation
    )
    SELECT
        i.product_id,
        product_name,
        brand_id,
        category_id,
        model_year,
        i.list_price,
        GETDATE(),
        'INS'
    FROM
        inserted i
    UNION ALL
    SELECT
        d.product_id,
        product_name,
        brand_id,
        category_id,
        model_year,
        d.list_price,
        GETDATE(),
        'DEL'
    FROM
        deleted d;
END
3,
CREATE TRIGGER production.trg_product_audit
ON production.products
AFTER INSERT, DELETE
AS
BEGIN
    SET NOCOUNT ON;
    INSERT INTO production.product_audits(
        product_id, 
        product_name,
        brand_id,
        category_id,
        model_year,
        list_price, 
        updated_at, 
        operation
    )
    SELECT
        i.product_id,
        product_name,
        brand_id,
        category_id,
        model_year,
        i.list_price,
        GETDATE(),
        'INS'
    FROM
        inserted i
    UNION ALL
    SELECT
        d.product_id,
        product_name,
        brand_id,
        category_id,
        model_year,
        d.list_price,
        GETDATE(),
        'DEL'
    FROM
        deleted d;
END
4 và
CREATE TRIGGER production.trg_product_audit
ON production.products
AFTER INSERT, DELETE
AS
BEGIN
    SET NOCOUNT ON;
    INSERT INTO production.product_audits(
        product_id, 
        product_name,
        brand_id,
        category_id,
        model_year,
        list_price, 
        updated_at, 
        operation
    )
    SELECT
        i.product_id,
        product_name,
        brand_id,
        category_id,
        model_year,
        i.list_price,
        GETDATE(),
        'INS'
    FROM
        inserted i
    UNION ALL
    SELECT
        d.product_id,
        product_name,
        brand_id,
        category_id,
        model_year,
        d.list_price,
        GETDATE(),
        'DEL'
    FROM
        deleted d;
END
5.

Ví dụ tạo trigger DML trong SQL Server

Đầu tiên, để tạo một trigger mới, bạn chỉ định tên của trigger và lược đồ mà trigger thuộc về sau mệnh đề

AS
BEGIN
7 như sau:


CREATE TRIGGER production.trg_product_audit

Tiếp theo, bạn chỉ định tên của bảng trong mệnh đề

CREATE TRIGGER production.trg_product_audit
ON production.products
AFTER INSERT, DELETE
AS
BEGIN
    SET NOCOUNT ON;
    INSERT INTO production.product_audits(
        product_id, 
        product_name,
        brand_id,
        category_id,
        model_year,
        list_price, 
        updated_at, 
        operation
    )
    SELECT
        i.product_id,
        product_name,
        brand_id,
        category_id,
        model_year,
        i.list_price,
        GETDATE(),
        'INS'
    FROM
        inserted i
    UNION ALL
    SELECT
        d.product_id,
        product_name,
        brand_id,
        category_id,
        model_year,
        d.list_price,
        GETDATE(),
        'DEL'
    FROM
        deleted d;
END
7, trigger sẽ kích hoạt khi xảy ra sự kiện trên bảng này:

ON production.products

Sau đó, bạn liệt kê một hoặc nhiều sự kiện sẽ kích hoạt trigger trong mệnh đề

SET NOCOUNT ON;
6:

AFTER INSERT, DELETE

Phần thân của trigger bắt đầu bằng từ khóa

CREATE TRIGGER production.trg_product_audit
ON production.products
AFTER INSERT, DELETE
AS
BEGIN
    SET NOCOUNT ON;
    INSERT INTO production.product_audits(
        product_id, 
        product_name,
        brand_id,
        category_id,
        model_year,
        list_price, 
        updated_at, 
        operation
    )
    SELECT
        i.product_id,
        product_name,
        brand_id,
        category_id,
        model_year,
        i.list_price,
        GETDATE(),
        'INS'
    FROM
        inserted i
    UNION ALL
    SELECT
        d.product_id,
        product_name,
        brand_id,
        category_id,
        model_year,
        d.list_price,
        GETDATE(),
        'DEL'
    FROM
        deleted d;
END
9:

AS
BEGIN

Sau đó, bên trong thân của trigger, bạn thiết lập

INSERT INTO production.products
(
    product_name, 
    brand_id, 
    category_id, 
    model_year, 
    list_price
)
VALUES 
(
    'Test product',
    1,
    1,
    2018,
    599
);
0 để ngăn chặn thông báo số lượng bản ghi bị ảnh hưởng bất cứ khi nào trigger được kích hoạt.

SET NOCOUNT ON;

Trigger sẽ

AS
BEGIN
0 một bản ghi vào bảng
INSERT INTO production.product_audits
(
    product_id,
    product_name,
    brand_id,
    category_id,
    model_year,
    list_price,
    updated_at,
    operation
)
SELECT
    i.product_id,
    product_name,
    brand_id,
    category_id,
    model_year,
    i.list_price,
    GETDATE(),
    'INS'
FROM
    inserted AS i
UNION ALL
SELECT
    d.product_id,
    product_name,
    brand_id,
    category_id,
    model_year,
    d.list_price,
    getdate(),
    'DEL'
FROM
    deleted AS d;
7 bất cứ khi nào một bản ghi được chèn vào hoặc xóa khỏi bảng
INSERT INTO production.product_audits
(
    product_id,
    product_name,
    brand_id,
    category_id,
    model_year,
    list_price,
    updated_at,
    operation
)
SELECT
    i.product_id,
    product_name,
    brand_id,
    category_id,
    model_year,
    i.list_price,
    GETDATE(),
    'INS'
FROM
    inserted AS i
UNION ALL
SELECT
    d.product_id,
    product_name,
    brand_id,
    category_id,
    model_year,
    d.list_price,
    getdate(),
    'DEL'
FROM
    deleted AS d;
6. Dữ liệu để chèn vào bảng
INSERT INTO production.product_audits
(
    product_id,
    product_name,
    brand_id,
    category_id,
    model_year,
    list_price,
    updated_at,
    operation
)
SELECT
    i.product_id,
    product_name,
    brand_id,
    category_id,
    model_year,
    i.list_price,
    GETDATE(),
    'INS'
FROM
    inserted AS i
UNION ALL
SELECT
    d.product_id,
    product_name,
    brand_id,
    category_id,
    model_year,
    d.list_price,
    getdate(),
    'DEL'
FROM
    deleted AS d;
7 được cung cấp từ bảng
INSERT INTO production.product_audits
(
    product_id,
    product_name,
    brand_id,
    category_id,
    model_year,
    list_price,
    updated_at,
    operation
)
SELECT
    i.product_id,
    product_name,
    brand_id,
    category_id,
    model_year,
    i.list_price,
    GETDATE(),
    'INS'
FROM
    inserted AS i
UNION ALL
SELECT
    d.product_id,
    product_name,
    brand_id,
    category_id,
    model_year,
    d.list_price,
    getdate(),
    'DEL'
FROM
    deleted AS d;
2 và
INSERT INTO production.product_audits
(
    product_id,
    product_name,
    brand_id,
    category_id,
    model_year,
    list_price,
    updated_at,
    operation
)
SELECT
    i.product_id,
    product_name,
    brand_id,
    category_id,
    model_year,
    i.list_price,
    GETDATE(),
    'INS'
FROM
    inserted AS i
UNION ALL
SELECT
    d.product_id,
    product_name,
    brand_id,
    category_id,
    model_year,
    d.list_price,
    getdate(),
    'DEL'
FROM
    deleted AS d;
3 thông qua toán tử
INSERT INTO production.products
(
    product_name, 
    brand_id, 
    category_id, 
    model_year, 
    list_price
)
VALUES 
(
    'Test product',
    1,
    1,
    2018,
    599
);
7 như sau:

INSERT INTO production.product_audits
(
    product_id,
    product_name,
    brand_id,
    category_id,
    model_year,
    list_price,
    updated_at,
    operation
)
SELECT
    i.product_id,
    product_name,
    brand_id,
    category_id,
    model_year,
    i.list_price,
    GETDATE(),
    'INS'
FROM
    inserted AS i
UNION ALL
SELECT
    d.product_id,
    product_name,
    brand_id,
    category_id,
    model_year,
    d.list_price,
    getdate(),
    'DEL'
FROM
    deleted AS d;

Sau đây câu lệnh tạo trigger hoàn chỉnh:

CREATE TRIGGER production.trg_product_audit
ON production.products
AFTER INSERT, DELETE
AS
BEGIN
    SET NOCOUNT ON;
    INSERT INTO production.product_audits(
        product_id, 
        product_name,
        brand_id,
        category_id,
        model_year,
        list_price, 
        updated_at, 
        operation
    )
    SELECT
        i.product_id,
        product_name,
        brand_id,
        category_id,
        model_year,
        i.list_price,
        GETDATE(),
        'INS'
    FROM
        inserted i
    UNION ALL
    SELECT
        d.product_id,
        product_name,
        brand_id,
        category_id,
        model_year,
        d.list_price,
        GETDATE(),
        'DEL'
    FROM
        deleted d;
END

Cuối cùng, bạn thực thi câu lệnh trên để tạo trigger. Khi trigger được tạo, bạn có thể tìm thấy nó trong thư mục Triggers của bảng như trong hình sau:

Trigger sql la gi

Kiểm tra hoạt động của trigger trong SQL Server

Câu lệnh sau đây chèn một bản ghi mới vào bảng

INSERT INTO production.product_audits
(
    product_id,
    product_name,
    brand_id,
    category_id,
    model_year,
    list_price,
    updated_at,
    operation
)
SELECT
    i.product_id,
    product_name,
    brand_id,
    category_id,
    model_year,
    i.list_price,
    GETDATE(),
    'INS'
FROM
    inserted AS i
UNION ALL
SELECT
    d.product_id,
    product_name,
    brand_id,
    category_id,
    model_year,
    d.list_price,
    getdate(),
    'DEL'
FROM
    deleted AS d;
6:

INSERT INTO production.products
(
    product_name, 
    brand_id, 
    category_id, 
    model_year, 
    list_price
)
VALUES 
(
    'Test product',
    1,
    1,
    2018,
    599
);

Vì sự kiện

SET NOCOUNT ON;
7 này, trigger
CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
00 đã được kích hoạt trên bảng
INSERT INTO production.product_audits
(
    product_id,
    product_name,
    brand_id,
    category_id,
    model_year,
    list_price,
    updated_at,
    operation
)
SELECT
    i.product_id,
    product_name,
    brand_id,
    category_id,
    model_year,
    i.list_price,
    GETDATE(),
    'INS'
FROM
    inserted AS i
UNION ALL
SELECT
    d.product_id,
    product_name,
    brand_id,
    category_id,
    model_year,
    d.list_price,
    getdate(),
    'DEL'
FROM
    deleted AS d;
6 và chèn một bản ghi vào bảng
INSERT INTO production.product_audits
(
    product_id,
    product_name,
    brand_id,
    category_id,
    model_year,
    list_price,
    updated_at,
    operation
)
SELECT
    i.product_id,
    product_name,
    brand_id,
    category_id,
    model_year,
    i.list_price,
    GETDATE(),
    'INS'
FROM
    inserted AS i
UNION ALL
SELECT
    d.product_id,
    product_name,
    brand_id,
    category_id,
    model_year,
    d.list_price,
    getdate(),
    'DEL'
FROM
    deleted AS d;
7.

Hãy xem nội dung của bảng

INSERT INTO production.product_audits
(
    product_id,
    product_name,
    brand_id,
    category_id,
    model_year,
    list_price,
    updated_at,
    operation
)
SELECT
    i.product_id,
    product_name,
    brand_id,
    category_id,
    model_year,
    i.list_price,
    GETDATE(),
    'INS'
FROM
    inserted AS i
UNION ALL
SELECT
    d.product_id,
    product_name,
    brand_id,
    category_id,
    model_year,
    d.list_price,
    getdate(),
    'DEL'
FROM
    deleted AS d;
7:

CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
0

Đây là đầu ra:

Trigger sql la gi

Câu lệnh sau xóa một bản ghi khỏi bảng

INSERT INTO production.product_audits
(
    product_id,
    product_name,
    brand_id,
    category_id,
    model_year,
    list_price,
    updated_at,
    operation
)
SELECT
    i.product_id,
    product_name,
    brand_id,
    category_id,
    model_year,
    i.list_price,
    GETDATE(),
    'INS'
FROM
    inserted AS i
UNION ALL
SELECT
    d.product_id,
    product_name,
    brand_id,
    category_id,
    model_year,
    d.list_price,
    getdate(),
    'DEL'
FROM
    deleted AS d;
6:

CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
1

Đúng như dự đoán, trigger đã được kích hoạt và chèn bản ghi đã xóa vào bảng

INSERT INTO production.product_audits
(
    product_id,
    product_name,
    brand_id,
    category_id,
    model_year,
    list_price,
    updated_at,
    operation
)
SELECT
    i.product_id,
    product_name,
    brand_id,
    category_id,
    model_year,
    i.list_price,
    GETDATE(),
    'INS'
FROM
    inserted AS i
UNION ALL
SELECT
    d.product_id,
    product_name,
    brand_id,
    category_id,
    model_year,
    d.list_price,
    getdate(),
    'DEL'
FROM
    deleted AS d;
7:

CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
0

Hình ảnh sau đây cho thấy đầu ra:

Trigger sql la gi

Trong hướng dẫn này, bạn đã học cách tạo một kích hoạt trong SQL Server để đáp ứng với một hoặc nhiều sự kiện như chèn và xóa.

Trigger INSTEAD OF trong SQL Server

Trong phần này, bạn sẽ tìm hiểu cách sử dụng trigger

CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
06 trong SQL Server để chèn dữ liệu vào bảng thông qua view.

Trigger INSTEAD OF là gì?

Trigger

CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
06 là một trigger cho phép bạn bỏ qua một câu lệnh
AS
BEGIN
0,
AS
BEGIN
2 hoặc
AS
BEGIN
1 một bảng hoặc một view và thực thi câu lệnh khác được định nghĩa trong trigger. Các thao tác chèn, xóa hoặc cập nhật thực tế hoàn toàn không xảy ra.

Nói cách khác, trigger

CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
06 bỏ qua một câu lệnh DML và thực thi các câu lệnh khác được định nghĩa trong trigger.

Cú pháp trigger INSTEAD OF trong SQL Server

Dưới đây minh họa cú pháp về cách tạo trigger

CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
06:

CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
3

Trong cú pháp này:

  • Đầu tiên, chỉ định tên của trigger và lược đồ (tùy chọn) mà trigger thuộc về sau mệnh đề
    AS
    BEGIN
    7.
  • Thứ hai, chỉ định tên của bảng hoặc view liên kết với trigger.
  • Thứ ba, xác định một sự kiện để kích hoạt trigger
    CREATE TABLE production.product_audits
    (
        change_id INT IDENTITY PRIMARY KEY,
        product_id INT NOT NULL,
        product_name VARCHAR(255) NOT NULL,
        brand_id INT NOT NULL,
        category_id INT NOT NULL,
        model_year SMALLINT NOT NULL,
        list_price DEC(10,2) NOT NULL,
        updated_at DATETIME NOT NULL,
        operation CHAR(3) NOT NULL,
        CHECK(operation = 'INS' or operation='DEL')
    );
    06 như
    SET NOCOUNT ON;
    7,
    SET NOCOUNT ON;
    9 hoặc
    SET NOCOUNT ON;
    8. Trigger có thể được kích hoạt với một hoặc nhiều sự kiện.
  • Thứ tư, định nghĩa phần thân của trigger sau từ khóa
    CREATE TRIGGER production.trg_product_audit
    ON production.products
    AFTER INSERT, DELETE
    AS
    BEGIN
        SET NOCOUNT ON;
        INSERT INTO production.product_audits(
            product_id, 
            product_name,
            brand_id,
            category_id,
            model_year,
            list_price, 
            updated_at, 
            operation
        )
        SELECT
            i.product_id,
            product_name,
            brand_id,
            category_id,
            model_year,
            i.list_price,
            GETDATE(),
            'INS'
        FROM
            inserted i
        UNION ALL
        SELECT
            d.product_id,
            product_name,
            brand_id,
            category_id,
            model_year,
            d.list_price,
            GETDATE(),
            'DEL'
        FROM
            deleted d;
    END
    9. Phần thân của trigger có thể bao gồm một hoặc nhiều câu lệnh Transact-SQL.

Ví dụ về trigger INSTEAD OF trong SQL Server

Một ví dụ điển hình của việc sử dụng trigger

CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
06 là ghi đè thao tác chèn, cập nhật hoặc xóa trên view.

Giả sử, một ứng dụng cần chèn các thương hiệu mới vào bảng

CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
20. Tuy nhiên, các thương hiệu mới nên được lưu trữ trong một bảng khác được gọi là
CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
21 để phê duyệt trước khi chèn vào bảng
CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
20.

Để thực hiện điều này, bạn tạo một view có tên là

CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
23 cho ứng dụng để chèn các thương hiệu mới. Nếu các thương hiệu được chèn vào view, một trigger
CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
06 sẽ được kích hoạt để chèn các thương hiệu vào bảng
CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
21.

Hình ảnh sau đây minh họa quá trình:

Trigger sql la gi

Sơ đồ này không hiển thị tên lược đồ của tất cả các đối tượng cơ sở dữ liệu vì mục đích đơn giản.

Câu lệnh sau đây tạo một bảng mới có tên

CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
21 để lưu trữ các thương hiệu đang chờ được phê duyệt:

CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
4

Câu lệnh sau đây tạo ra một view mới tên là

CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
23 dựa vào bảng
CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
20 và
CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
21:

CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
5

Khi một bản ghi được chèn vào view

CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
23, chúng ta cần chuyển nó tới bảng
CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
21 thông qua trigger
CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
06 như sau:

CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
6

Trigger chèn tên thương hiệu mới vào bảng

CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
21 nếu tên thương hiệu không tồn tại trong bảng
CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
20.

Bây giờ chúng ta hãy chèn một thương hiệu mới vào view

CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
23 để xem chuyện gì xảy ra nhé:

CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
7

Câu lệnh

SET NOCOUNT ON;
7 này đã kích hoạt trigger
CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
06 để chèn một bản ghi mới vào bảng
CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
21.

Nếu bạn truy vấn dữ liệu từ view

CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
23, bạn sẽ thấy một bản ghi mới xuất hiện:

CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
8
Trigger sql la gi

Câu lệnh sau đây cho thấy nội dung của bảng

CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
21:

CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
9
Trigger sql la gi

Trong phần này, bạn đã tìm hiểu về trigger

CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
06 trong SQL Server và cách tạo trigger
CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
06 để chèn dữ liệu vào bảng thông qua view.

Trigger DDL trong SQL Server

Trong phần này, bạn sẽ tìm hiểu cách sử dụng trigger ngôn ngữ định nghĩa dữ liệu (Data Definition Language - DDL) của SQL Server để theo dõi các thay đổi được thực hiện đối với các đối tượng cơ sở dữ liệu.

Giới thiệu về trigger DDL trong SQL Server

Trigger DDL của SQL Server phản hồi các sự kiện máy chủ hoặc cơ sở dữ liệu hơn là các sửa đổi dữ liệu bảng. Những sự kiện này được tạo ra bởi các câu lệnh Transact-SQL thường bắt đầu với một trong những từ khóa sau

AS
BEGIN
3,
AS
BEGIN
4,
AS
BEGIN
5,
CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
46,
CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
47,
CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
48 hoặc
CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
49.

Ví dụ: bạn có thể viết một trigger DDL để ghi nhật ký bất cứ khi nào người dùng thực thi câu lệnh

CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
50 hoặc
CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
51.

Trigger DDL hữu ích trong các trường hợp sau:

  • Ghi lại các thay đổi trong lược đồ cơ sở dữ liệu.
  • Ngăn chặn một số thay đổi cụ thể đối với lược đồ cơ sở dữ liệu.
  • Phản ứng với một thay đổi trong lược đồ cơ sở dữ liệu.

Phần sau trình bày cú pháp tạo trigger DDL:


CREATE TRIGGER production.trg_product_audit
0

SET NOCOUNT ON;4

Chỉ định tên trình kích hoạt do người dùng định nghĩa sau từ khóa

AS
BEGIN
7. Lưu ý rằng bạn không phải chỉ định lược đồ (schema) cho một trigger DDL vì nó không liên quan đến table hoặc view cơ sở dữ liệu thực tế.

CREATE TABLE production.product_audits ( change_id INT IDENTITY PRIMARY KEY, product_id INT NOT NULL, product_name VARCHAR(255) NOT NULL, brand_id INT NOT NULL, category_id INT NOT NULL, model_year SMALLINT NOT NULL, list_price DEC(10,2) NOT NULL, updated_at DATETIME NOT NULL, operation CHAR(3) NOT NULL, CHECK(operation = 'INS' or operation='DEL') );54

Sử dụng

CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
55 nếu trình kích hoạt phản hồi các sự kiện trong phạm vi cơ sở dữ liệu hoặc
CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
56 nếu trình kích hoạt phản hồi các sự kiện trong phạm vi máy chủ.

CREATE TABLE production.product_audits ( change_id INT IDENTITY PRIMARY KEY, product_id INT NOT NULL, product_name VARCHAR(255) NOT NULL, brand_id INT NOT NULL, category_id INT NOT NULL, model_year SMALLINT NOT NULL, list_price DEC(10,2) NOT NULL, updated_at DATETIME NOT NULL, operation CHAR(3) NOT NULL, CHECK(operation = 'INS' or operation='DEL') );57

Các tùy chọn

CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
57 chỉ rõ mệnh đề
CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
59 và / hoặc
CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
60.
CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
59 mã hóa định nghĩa của trigger.
CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
60 xác định bối cảnh bảo mật mà theo đó trigger được thực thi.

CREATE TABLE production.product_audits ( change_id INT IDENTITY PRIMARY KEY, product_id INT NOT NULL, product_name VARCHAR(255) NOT NULL, brand_id INT NOT NULL, category_id INT NOT NULL, model_year SMALLINT NOT NULL, list_price DEC(10,2) NOT NULL, updated_at DATETIME NOT NULL, operation CHAR(3) NOT NULL, CHECK(operation = 'INS' or operation='DEL') );63

Các

CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
64 chỉ ra một sự kiện DDL kích hoạt trigger như
CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
65,
CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
66, vv.

CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
67 là một nhóm các sự kiện
CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
64 chẳng hạn như
CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
69.

Trigger có thể đăng ký một hoặc nhiều sự kiện hoặc nhóm sự kiện.

Ví dụ về tạo trigger DDL trong SQL Server

Giả sử bạn muốn nắm bắt tất cả các sửa đổi được thực hiện đối với chỉ mục cơ sở dữ liệu để bạn có thể theo dõi tốt hơn hiệu suất của máy chủ cơ sở dữ liệu liên quan đến những thay đổi chỉ mục này.

Đầu tiên, tạo một bảng mới có tên

CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
70 để ghi các thay đổi chỉ mục:


CREATE TRIGGER production.trg_product_audit
1

Tiếp theo, tạo một trigger DDL để theo dõi các thay đổi chỉ mục và chèn dữ liệu sự kiện vào bảng

CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
70:


CREATE TRIGGER production.trg_product_audit
2

Trong phần thân của trigger, chúng tôi đã sử dụng hàm

CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
72 trả về thông tin về các sự kiện máy chủ hoặc cơ sở dữ liệu. Hàm này chỉ khả dụng bên trong DDL hoặc trình kích hoạt đăng nhập.

Sau đó, tạo chỉ mục cho cột

CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
73 và
CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
74 của bảng
CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
75:


CREATE TRIGGER production.trg_product_audit
3

Sau đó, truy vấn dữ liệu từ bảng

CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
76 để kiểm tra xem sự kiện tạo chỉ mục có được trình kích hoạt ghi lại đúng cách hay không:


CREATE TRIGGER production.trg_product_audit
4

Đây là đầu ra:

Trigger sql la gi

Nếu bạn nhấp vào ô của cột

CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
77, bạn có thể xem dữ liệu XML của sự kiện như sau:

Trigger sql la gi

Trong phần này, bạn đã tìm hiểu cách tạo trigger DDL trong SQL Server phản hồi một hoặc nhiều sự kiện DDL.

Tắt trigger trong SQL Server

Trong phần này, bạn sẽ tìm hiểu cách sử dụng câu lệnh

CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
78 trong SQL Server để tắt trigger.

Giới thiệu lệnh DISABLE TRIGGER trong SQL Server

Đôi khi, vì mục đích khắc phục sự cố hoặc khôi phục dữ liệu, bạn có thể muốn tắt tạm thời trigger. Để làm điều này, bạn sử dụng câu lệnh

CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
78:


CREATE TRIGGER production.trg_product_audit
5

Trong cú pháp này:

  • Trước tiên, hãy chỉ định tên của lược đồ chứa trigger và tên của trigger mà bạn muốn tắt sau lệnh
    CREATE TABLE production.product_audits
    (
        change_id INT IDENTITY PRIMARY KEY,
        product_id INT NOT NULL,
        product_name VARCHAR(255) NOT NULL,
        brand_id INT NOT NULL,
        category_id INT NOT NULL,
        model_year SMALLINT NOT NULL,
        list_price DEC(10,2) NOT NULL,
        updated_at DATETIME NOT NULL,
        operation CHAR(3) NOT NULL,
        CHECK(operation = 'INS' or operation='DEL')
    );
    78.
  • Thứ hai, chỉ định tên bảng hoặc view mà trigger được liên kết nếu trigger là trigger DML. Sử dụng
    CREATE TABLE production.product_audits
    (
        change_id INT IDENTITY PRIMARY KEY,
        product_id INT NOT NULL,
        product_name VARCHAR(255) NOT NULL,
        brand_id INT NOT NULL,
        category_id INT NOT NULL,
        model_year SMALLINT NOT NULL,
        list_price DEC(10,2) NOT NULL,
        updated_at DATETIME NOT NULL,
        operation CHAR(3) NOT NULL,
        CHECK(operation = 'INS' or operation='DEL')
    );
    55 nếu trigger có phạm vi cơ sở dữ liệu DDL hoặc
    CREATE TABLE production.product_audits
    (
        change_id INT IDENTITY PRIMARY KEY,
        product_id INT NOT NULL,
        product_name VARCHAR(255) NOT NULL,
        brand_id INT NOT NULL,
        category_id INT NOT NULL,
        model_year SMALLINT NOT NULL,
        list_price DEC(10,2) NOT NULL,
        updated_at DATETIME NOT NULL,
        operation CHAR(3) NOT NULL,
        CHECK(operation = 'INS' or operation='DEL')
    );
    82 nếu trigger có phạm vi máy chủ DDL.

Ví dụ về lệnh DISABLE TRIGGER trong SQL Server

Câu lệnh sau tạo một bảng mới có tên

CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
83 để minh họa:


CREATE TRIGGER production.trg_product_audit
6

Câu lệnh sau tạo một trigger được kích hoạt bất cứ khi nào một hàng mới được chèn vào bảng

CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
83. Với mục đích minh họa, trigger chỉ trả về một thông báo đơn giản.


CREATE TRIGGER production.trg_product_audit
7

Câu lệnh sau sẽ chèn một hàng mới vào bảng

CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
83:


CREATE TRIGGER production.trg_product_audit
8

Do sự kiện

SET NOCOUNT ON;
7 này, trigger đã được kích hoạt và in ra thông báo sau:


CREATE TRIGGER production.trg_product_audit
9

Để tắt trigger

CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
87, bạn sử dụng câu lệnh
CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
78 như sau:

ON production.products
0

Bây giờ nếu bạn chèn một hàng mới vào bảng

CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
83, trigger sẽ không được kích hoạt.

ON production.products
1

Nó có nghĩa là trình kích hoạt đã bị vô hiệu hóa.

Lưu ý rằng trigger vẫn còn trên bảng. Nếu bạn xem trigger trong SQL Server Management Studio (SSMS), bạn sẽ nhận thấy biểu tượng chữ thập đỏ trên tên trigger bị vô hiệu hóa:
Trigger sql la gi

Tắt tất cả trigger của bảng trong SQL Server

Để tắt tất cả các trigger của bảng, bạn sử dụng câu lệnh sau:

ON production.products
2

Trong câu lệnh này, bạn chỉ cần chỉ định tên của bảng để vô hiệu hóa tất cả các trigger thuộc về bảng đó.

Câu lệnh sau tạo một trigger mới trên bảng

CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
83 được kích hoạt sau sự kiện xóa:

ON production.products
3

Để tắt tất cả các trigger trên bảng

CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
83, bạn sử dụng câu lệnh sau:

ON production.products
4

Hình ảnh sau đây cho thấy trạng thái của tất cả các trigger thuộc bảng

CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
83:

Trigger sql la gi

Tắt tất cả các trigger của cơ sở dữ liệu trong SQL Server

Để tắt tất cả các trigger của cơ sở dữ liệu hiện tại, bạn sử dụng câu lệnh sau:

ON production.products
5

Bật trigger trong SQL Server

Trong phần này, bạn sẽ tìm hiểu cách sử dụng câu lệnh

CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
93 trong SQL Server để bật trigger.

Giới thiệu về câu lệnh ENABLE TRIGGER trong SQL Server

Câu lệnh

CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
93 cho phép bạn bật trigger để nó có thể được kích hoạt bất cứ khi nào một sự kiện xảy ra.

Sau đây minh họa cú pháp của câu lệnh

CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
93:

ON production.products
6

Trong cú pháp này:

  • Đầu tiên, chỉ định tên của trigger mà bạn muốn bật. Theo tùy chọn, bạn có thể chỉ định tên của lược đồ chứa trigger.
  • Thứ hai, chỉ định bảng chứa trigger nếu nó là trigger DML. Sử dụng
    CREATE TABLE production.product_audits
    (
        change_id INT IDENTITY PRIMARY KEY,
        product_id INT NOT NULL,
        product_name VARCHAR(255) NOT NULL,
        brand_id INT NOT NULL,
        category_id INT NOT NULL,
        model_year SMALLINT NOT NULL,
        list_price DEC(10,2) NOT NULL,
        updated_at DATETIME NOT NULL,
        operation CHAR(3) NOT NULL,
        CHECK(operation = 'INS' or operation='DEL')
    );
    55 nếu trigger là trigger có phạm vi cơ sở dữ liệu DDL hoặc
    CREATE TABLE production.product_audits
    (
        change_id INT IDENTITY PRIMARY KEY,
        product_id INT NOT NULL,
        product_name VARCHAR(255) NOT NULL,
        brand_id INT NOT NULL,
        category_id INT NOT NULL,
        model_year SMALLINT NOT NULL,
        list_price DEC(10,2) NOT NULL,
        updated_at DATETIME NOT NULL,
        operation CHAR(3) NOT NULL,
        CHECK(operation = 'INS' or operation='DEL')
    );
    56 nếu trigger là trigger có phạm vi máy chủ DDL.

Ví dụ về lệnh ENABLE TRIGGER trong SQL Server

Chúng tôi sẽ sử dụng bảng

CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
83 được tạo trong phần
CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
78 để minh họa.

Để bật trigger


CREATE TRIGGER production.trg_product_audit
00, bạn sử dụng câu lệnh sau:

ON production.products
7

Sau khi được bật, bạn có thể thấy trạng thái của trigger thông qua SQL Server Management Studio như được hiển thị trong hình sau:

Trigger sql la gi

Bật tất cả trigger của bảng trong SQL Server

Để bật tất cả các trigger của một bảng, bạn sử dụng câu lệnh sau:

ON production.products
8

Trong cú pháp này, bạn chỉ cần chỉ định tên của bảng mà bạn muốn bật tất cả các trigger được liên kết.

Ví dụ: để bật tất cả các trigger của bảng

CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
83, bạn sử dụng câu lệnh sau:

ON production.products
9

Hình ảnh sau đây cho thấy trạng thái của tất cả các trigger của bảng

CREATE TABLE production.product_audits
(
    change_id INT IDENTITY PRIMARY KEY,
    product_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    brand_id INT NOT NULL,
    category_id INT NOT NULL,
    model_year SMALLINT NOT NULL,
    list_price DEC(10,2) NOT NULL,
    updated_at DATETIME NOT NULL,
    operation CHAR(3) NOT NULL,
    CHECK(operation = 'INS' or operation='DEL')
);
83:

Trigger sql la gi

Bật tất cả trigger của cơ sở dữ liệu trong SQL Server

Để bật tất cả trigger của cơ sở dữ liệu hiện tại, bạn sử dụng câu lệnh sau:

AFTER INSERT, DELETE
0

4 cách xem code của trigger trong SQL Server

Trong phần này, bạn sẽ tìm hiểu 4 cách xem code của trigger trong SQL Server.

Xem code của trigger bằng cách truy vấn từ view hệ thống

Bạn có thể xem code của trigger bằng cách truy vấn dữ liệu dựa trên view


CREATE TRIGGER production.trg_product_audit
03:

AFTER INSERT, DELETE
1

Đây là đầu ra:

Trigger sql la gi

Trong truy vấn này, bạn truyền tên của trigger mà bạn muốn xem code cho hàm


CREATE TRIGGER production.trg_product_audit
04 trong mệnh đề

CREATE TRIGGER production.trg_product_audit
05.

Xem code của trigger bằng cách sử dụng hàm OBJECT_DEFINITION

Bạn có thể xem code của trigger bằng cách sử dụng hàm


CREATE TRIGGER production.trg_product_audit
06 như sau:

AFTER INSERT, DELETE
2

Trong truy vấn này, bạn truyền tên trigger cho hàm OBJECT_ID để lấy ID của trigger. Sau đó, bạn sử dụng hàm


CREATE TRIGGER production.trg_product_audit
07 để lấy code của trigger dựa trên ID của nó.

Xem code của trigger bằng cách sử dụng stored procedure sp_helptext

Cách đơn giản nhất để lấy code của trigger là sử dụng stored procedure sp_helptext như sau:

AFTER INSERT, DELETE
3

Stored procedure


CREATE TRIGGER production.trg_product_audit
08 trả về code được sử dụng để tạo ra một đối tượng, trong trường hợp này là trigger.

Xem code của trigger bằng SSMS

Để xem code của trigger DML:

  1. Đầu tiên, trong Object Explorer, kết nối với cơ sở dữ liệu.
  2. Thứ hai, di chuyển tới bảng chứa trigger mà bạn muốn xem code.
  3. Thứ ba, mở rộng menu Triggers, bấm chuột phải vào trigger bạn muốn xem code, sau đó bấm Modify. Code định nghĩa trigger xuất hiện trong cửa sổ truy vấn.
Trigger sql la gi

Liệt kê tất cả trigger trong SQL Server

Để liệt kê tất cả trigger trong SQL Server, bạn truy vấn dữ liệu từ view


CREATE TRIGGER production.trg_product_audit
09 như sau:

AFTER INSERT, DELETE
4

Hình ảnh sau đây cho thấy đầu ra:

Trigger sql la gi

Xóa trigger trong SQL Server

Trong phần này, bạn sẽ tìm hiểu cách sử dụng câu lệnh


CREATE TRIGGER production.trg_product_audit
10 trong SQL Server để xóa các trigger hiện có.

Giới thiệu lệnh DROP TRIGGER trong SQL Server

Câu lệnh


CREATE TRIGGER production.trg_product_audit
10 trong SQL Server xóa một hoặc nhiều trigger khỏi cơ sở dữ liệu. Phần sau minh họa cú pháp của câu lệnh

CREATE TRIGGER production.trg_product_audit
10 để xóa trigger DML: