DML 触发器的执行顺序
本节主要介绍 DML 触发器的执行顺序。
同一关系上触发器的触发顺序
如果为同一个关系上的同一事件定义了超过一个触发器,它们将按照其名称的字母表顺序被触发。
在 BEFORE 和 INSTEAD OF 触发器的情况下,每一个触发器返回的可能被修改的行将成为下一个触发器的输入。如果任何一个 BEFORE 或 INSTEAD OF 触发器返回 NULL,该操作将在该行上被禁用并且对于该行不会触发后续的触发器。
约束与触发器的顺序
在 Vastbase 数据库中,约束是在自定义触发器之前执行的。当进行插入、更新或删除操作时,约束先于触发器执行。
约束的执行顺序保证了数据的完整性和一致性。由于约束是在触发器之前执行的,这意味着如果数据不符合任何约束条件,触发器不会触发。
示例
1、创建示例表。
CREATE TABLE products (
product_id SERIAL PRIMARY KEY,
product_name VARCHAR(50) UNIQUE,
product_count INTEGER
);
INSERT INTO products (product_name, product_count) VALUES ('apple', 3);
INSERT INTO products (product_name, product_count) VALUES ('banana', 2);
2、创建触发器函数。
CREATE OR REPLACE FUNCTION update_product_name_func() RETURNS TRIGGER AS
$$
BEGIN
RAISE NOTICE 'Product name updated';
RETURN NEW;
END
$$LANGUAGE PLPGSQL;
3、创建触发器,引用创建的触发器函数 update_product_name_func()。
CREATE TRIGGER tri_update_product_name
AFTER UPDATE OF product_name ON products
FOR EACH ROW
EXECUTE PROCEDURE update_product_name_func();
4、验证约束和触发器执行顺序。
插入违反唯一性约束的数据。
INSERT INTO products (product_name, product_count) VALUES ('apple', 7);
插入失败,触发器没有执行。
ERROR: duplicate key value violate unique constraint "products_product_name_key" DETAIL: Key(product_name)=(apple) already exists.
更新 product_name 列。
UPDATE products SET product_name = 'peach' WHERE product_id = 1;
返回结果如下,说明执行了触发器。
Product name updated