PostgreSQL Trình kích hoạt: Tạo, liệt kê và thả kèm ví dụ

⚡ Tóm tắt thông minh

PostgreSQL Trigger là các hàm tự động chạy khi sự kiện INSERT, UPDATE hoặc DELETE xảy ra trên một bảng, cho phép cơ sở dữ liệu thực thi các quy tắc, ghi nhật ký thay đổi và kiểm tra dữ liệu mà không cần thêm mã ứng dụng.

  • Định nghĩa: Trigger là một hàm được tự động gọi khi xảy ra sự kiện trong cơ sở dữ liệu, chẳng hạn như INSERT, UPDATE hoặc DELETE.
  • 🔁 Phạm vi: Lệnh FOR EACH ROW thực thi trình kích hoạt một lần cho mỗi hàng bị ảnh hưởng, trong khi lệnh FOR EACH STATEMENT thực thi nó một lần cho mỗi thao tác.
  • 🛠️ Tạo nên: Lệnh CREATE TRIGGER liên kết một hàm với một bảng và thiết lập thời gian thực hiện BEFORE, AFTER hoặc INSTEAD OF.
  • 📋 Danh sách: Truy vấn danh mục pg_trigger bằng lệnh SELECT tgname để xem tất cả các trigger trong cơ sở dữ liệu.
  • 🗑️ Rơi vãi: Lệnh DROP TRIGGER loại bỏ một trình kích hoạt, và lệnh IF EXISTS ngăn ngừa lỗi khi trình kích hoạt đó bị thiếu.
  • 🤖 Hỗ trợ AI: Trợ lý AI tạo ra các chức năng kích hoạt và đề xuất thời điểm TRƯỚC hoặc SAU dựa trên yêu cầu bằng ngôn ngữ thông thường.

PostgreSQL Triggers

Kích hoạt là gì PostgreSQL?

A PostgreSQL Cò súng Trigger là một hàm được kích hoạt tự động khi một sự kiện cơ sở dữ liệu xảy ra trên một đối tượng cơ sở dữ liệu, ví dụ như một bảng. Ví dụ về các sự kiện cơ sở dữ liệu có thể kích hoạt trigger bao gồm INSERT, UPDATE, DELETE, v.v. Hơn nữa, khi bạn tạo trigger cho một bảng, trigger sẽ tự động bị xóa khi bảng đó bị xóa.

Cách sử dụng Trigger trong PostgreSQL?

Một trigger có thể được đánh dấu bằng toán tử FOR EACH ROW khi tạo. Trigger như vậy sẽ được gọi một lần cho mỗi hàng được sửa đổi bởi thao tác. Một trigger cũng có thể được đánh dấu bằng toán tử FOR EACH STATEMENT khi tạo. Trigger này sẽ chỉ được thực thi một lần cho một thao tác cụ thể.

PostgreSQL Tạo Trigger

Để tạo trigger, chúng ta sử dụng hàm CREATE TRIGGER. Đây là cú pháp của hàm:

CREATE TRIGGER trigger-name [BEFORE|AFTER|INSTEAD OF] event-name
ON table-name
[
 -- Trigger logic
];

Tên trình kích hoạt là tên của trình kích hoạt.

TRƯỚC, SAU và INSTEAD OF là các từ khóa xác định thời điểm kích hoạt sẽ được gọi.

Tên sự kiện là tên của sự kiện sẽ kích hoạt trình kích hoạt. Điều này có thể là CHÈN, CẬP NHẬT, XÓA, v.v.

Tên bảng là tên của bảng mà trigger sẽ được tạo trên đó.

Nếu trình kích hoạt được tạo cho thao tác INSERT, chúng ta phải thêm tham số tên cột BẬT.

Cú pháp sau đây minh họa điều này:

CREATE TRIGGER trigger-name AFTER INSERT ON column-name
ON table-name
[
 -- Trigger logic
];

PostgreSQL Tạo ví dụ kích hoạt

Chúng tôi sẽ sử dụng bảng Giá được đưa ra dưới đây:

Giá:

PostgreSQL Tạo Trigger

Chúng ta hãy tạo một bảng khác, Price_Audits, nơi chúng ta sẽ ghi lại những thay đổi được thực hiện đối với bảng Giá:

CREATE TABLE Price_Audits (
   book_id INT NOT NULL,
    entry_date text NOT NULL
);

Bây giờ chúng ta có thể định nghĩa một hàm mới có tên là Auditfunc:

CREATE OR REPLACE FUNCTION auditfunc() RETURNS TRIGGER AS $my_table$
   BEGIN
      INSERT INTO Price_Audits(book_id, entry_date) VALUES (new.ID, current_timestamp);
      RETURN NEW;
   END;
$my_table$ LANGUAGE plpgsql;

Hàm trên sẽ chèn một bản ghi vào bảng Price_Audits bao gồm id hàng mới và thời gian tạo bản ghi.

Giờ chúng ta đã có hàm kích hoạt, chúng ta cần liên kết nó với bảng Giá. Chúng ta sẽ đặt tên cho hàm kích hoạt là price_trigger. Trước khi một bản ghi mới được tạo, hàm kích hoạt sẽ được tự động gọi để ghi lại các thay đổi. Đây là hàm kích hoạt:

CREATE TRIGGER price_trigger AFTER INSERT ON Price
FOR EACH ROW EXECUTE PROCEDURE auditfunc();

Chúng ta chèn một bản ghi mới vào bảng Price:

INSERT INTO Price
VALUES (3, 400);

Giờ đây, vì chúng ta đã chèn một bản ghi vào bảng Price, một bản ghi khác cũng sẽ được chèn vào bảng Price_Audits do trigger mà chúng ta đã tạo. Hãy cùng kiểm tra điều này:

SELECT * FROM Price_Audits;

Kết quả trả về sẽ như sau:

PostgreSQL Tạo Trigger

Trình kích hoạt đã hoạt động thành công.

PostgreSQL Kích hoạt danh sách

Tất cả trình kích hoạt mà bạn tạo trong PostgreSQL được lưu trữ trong bảng pg_trigger. Để xem danh sách trình kích hoạt mà bạn có trên cơ sở dữ liệu, truy vấn bảng bằng cách chạy lệnh SELECT như dưới đây:

SELECT tgname FROM pg_trigger;

Điều này trả về như sau:

PostgreSQL Kích hoạt danh sách

Cột tgname của bảng pg_trigger biểu thị tên của trình kích hoạt.

PostgreSQL Cò súng thả

Khi không còn cần đến một trình kích hoạt nữa, bạn có thể gỡ bỏ nó dễ dàng. Để gỡ bỏ một PostgreSQL trigger, chúng ta sử dụng câu lệnh DROP TRIGGER với cú pháp sau:

DROP TRIGGER [IF EXISTS] trigger-name
ON table-name [ CASCADE | RESTRICT ];

Tham số tên trình kích hoạt biểu thị tên của trình kích hoạt sẽ bị xóa.

Tên bảng biểu thị tên của bảng mà trình kích hoạt sẽ bị xóa.

Mệnh đề IF EXISTS cố gắng xóa một trigger tồn tại. Nếu bạn cố gắng xóa một trình kích hoạt không tồn tại mà không sử dụng mệnh đề IF EXISTS, bạn sẽ gặp lỗi.

Tùy chọn CASCADE sẽ giúp bạn tự động loại bỏ tất cả các đối tượng phụ thuộc vào trình kích hoạt.

Nếu bạn sử dụng tùy chọn GIỚI HẠN, trình kích hoạt sẽ không bị xóa nếu các đối tượng phụ thuộc vào nó.

Ví dụ:

Để xóa trình kích hoạt có tên example_trigger khỏi bảng Company, hãy chạy lệnh sau:

DROP TRIGGER example_trigger IF EXISTS
ON Company;

Sử dụng pgAdmin

Bây giờ chúng ta hãy xem cách thực hiện cả ba thao tác này bằng pgAdmin.

Cách tạo trình kích hoạt trong PostgreSQL sử dụng pgAdmin

Đây là cách bạn có thể tạo một trình kích hoạt trong PostgreSQL sử dụng pgAdmin:

Bước 1) Đăng nhập vào tài khoản pgAdmin của bạn

Mở pgAdmin và đăng nhập vào tài khoản của bạn bằng thông tin đăng nhập.

Bước 2) Tạo cơ sở dữ liệu demo

  1. Từ thanh điều hướng ở bên trái, nhấp vào Cơ sở dữ liệu.
  2. Nhấp vào Bản trình diễn.

Tạo trình kích hoạt trong PostgreSQL sử dụng pgAdmin

Bước 3) Nhập truy vấn

Để tạo bảng Price_Audits, hãy nhập truy vấn vào trình soạn thảo:

CREATE TABLE Price_Audits (
   book_id INT NOT NULL,
    entry_date text NOT NULL
)

Bước 4) Thực hiện truy vấn

Nhấp vào nút Thực hiện.

Tạo trình kích hoạt trong PostgreSQL sử dụng pgAdmin

Bước 5) Chạy Code cho auditfunc

Chạy mã sau để xác định hàm auditfunc:

CREATE OR REPLACE FUNCTION auditfunc() RETURNS TRIGGER AS $my_table$
   BEGIN
      INSERT INTO Price_Audits(book_id, entry_date) VALUES (new.ID, current_timestamp);
      RETURN NEW;
   END;
$my_table$ LANGUAGE plpgsql

Bước 6) Chạy Code để tạo trình kích hoạt

Chạy mã sau để tạo giá trị kích hoạt price_trigger:

CREATE TRIGGER price_trigger AFTER INSERT ON Price
FOR EACH ROW EXECUTE PROCEDURE auditfunc()

Bước 7) Chèn bản ghi mới

  1. Chạy lệnh sau để chèn bản ghi mới vào bảng Giá:
INSERT INTO Price
VALUES (3, 400)
  1. Chạy lệnh sau để kiểm tra xem bản ghi có được chèn vào bảng Price_Audits hay không:
SELECT * FROM Price_Audits

Điều này sẽ trả về như sau:

Tạo trình kích hoạt trong PostgreSQL sử dụng pgAdmin

Bước 8) Kiểm tra nội dung bảng

Chúng ta hãy kiểm tra nội dung của bảng Price_Audits.

Trình kích hoạt danh sách bằng pgAdmin

Bước 1) Chạy lệnh sau để kiểm tra các kích hoạt trong cơ sở dữ liệu của bạn:

SELECT tgname FROM pg_trigger

Điều này trả về như sau:

Trình kích hoạt danh sách bằng pgAdmin

Rơiping Kích hoạt bằng pgAdmin

Để xóa trình kích hoạt có tên example_trigger khỏi bảng Company, hãy chạy lệnh sau:

DROP TRIGGER example_trigger IF EXISTS
ON Company

Tải xuống Cơ sở dữ liệu được sử dụng trong Hướng dẫn này

Câu Hỏi Thường Gặp

Trigger BEFORE chạy trước khi thay đổi hàng được ghi lại, do đó nó có thể sửa đổi hoặc từ chối hàng đó. Trigger AFTER chạy sau khi thay đổi được lưu, phù hợp với các tác vụ ghi nhật ký và kiểm toán.

Trigger INSTEAD OF được định nghĩa trên một view, chứ không phải trên một bảng. Nó thay thế các lệnh INSERT, UPDATE hoặc DELETE bằng logic tùy chỉnh, biến một view chỉ đọc thành view có thể ghi.

Các hàm kích hoạt thường được viết bằng PL/pgSQL. PostgreSQL cũng hỗ trợ PL/PythonPL/Perl, PL/Tcl và C, vì vậy bạn có thể chọn ngôn ngữ phù hợp với logic của mình.

Sử dụng lệnh ALTER TABLE table-name DISABLE TRIGGER trigger-name để tắt nó đi và ENABLE TRIGGER để bật lại. Điều này tránh việc mất dữ liệu.ping và tái tạo lại cơ chế kích hoạt trong quá trình tải hàng loạt.

Đúng vậy. Mỗi trigger sẽ thêm công việc vào mọi hàng hoặc câu lệnh bị ảnh hưởng, vì vậy logic trigger phức tạp có thể làm chậm quá trình ghi. Hãy giữ cho các hàm trigger ngắn gọn và lập chỉ mục cho bất kỳ cột nào chúng truy vấn.

Đúng vậy. Nếu một trigger thay đổi một bảng khác mà bảng đó cũng có trigger, thì các trigger đó cũng sẽ được kích hoạt, tạo ra hiệu ứng dây chuyền trigger. PostgreSQL Giới hạn độ sâu lồng nhau để ngăn chặn vòng lặp vô hạn.

Các trợ lý lập trình AI sẽ chuyển yêu cầu bằng ngôn ngữ thông thường thành câu lệnh CREATE TRIGGER hoàn chỉnh và hàm kích hoạt, đề xuất thời điểm BEFORE hoặc AFTER, đồng thời giải thích mã PL/pgSQL được tạo ra để dễ dàng xem xét nhanh chóng.

Đúng vậy. Các công cụ như pgai và các trợ lý dựa trên GPT sẽ dịch quy tắc đã mô tả thành câu lệnh SQL kích hoạt, và có thể xây dựng các câu lệnh INSERT tự động gắn thẻ hoặc xác thực dữ liệu mới khi dữ liệu được thêm vào.

Tóm tắt bài viết này với: