触发器(Trigger)
简介
触发器是一种特殊的函数,当某个数据变更事件(INSERT、UPDATE、DELETE 或者 TRUNCATE)或者数据库事件(DDL语句)发生时自动执行,而不是由用户或者应用程序进行调用。
触发时机 |
触发事件 |
行级 |
语句级 |
---|---|---|---|
BEFORE |
INSERT/UPDATE/DELETE |
表 |
表和视图 |
TRUNCATE |
不支持 |
表 |
|
AFTER |
INSERT/UPDATE/DELETE |
表 |
表和视图 |
TRUNCATE |
不支持 |
表 |
|
INSTEAD OF |
INSERT/UPDATE/DELETE |
视图 |
不支持 |
TRUNCATE |
不支持 |
不支持 |
管理触发器
- 创建触发器
--创建COMPANY表。 gaussdb=# CREATE TABLE COMPANY( ID INT PRIMARY KEY NOT NULL, NAME TEXT NOT NULL, AGE INT NOT NULL, ADDRESS CHAR(50), SALARY REAL); NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "company_pkey" for table "company" CREATE TABLE --创建AUDIT表。 gaussdb=# CREATE TABLE AUDIT( EMP_ID INT NOT NULL, ENTRY_DATE TEXT NOT NULL); CREATE TABLE --使用CREATE FUNCTION语句创建一个触发器函数。 gaussdb=# CREATE OR REPLACE FUNCTION auditlogfunc() RETURNS TRIGGER AS $example_table$ BEGIN INSERT INTO AUDIT(EMP_ID, ENTRY_DATE) VALUES (new.ID, current_timestamp); RETURN NEW; END; $example_table$ LANGUAGE plpgsql; CREATE FUNCTION --使用CREATE TRIGGER语句将该函数与表进行关联。 gaussdb=# CREATE TRIGGER example_trigger AFTER INSERT ON company FOR EACH ROW EXECUTE PROCEDURE auditlogfunc(); CREATE TRIGGER --向company表中插入数据。 gaussdb=# INSERT INTO company (ID,NAME,AGE,ADDRESS,SALARY) VALUES (1, '张三', 32, '济南', 20000.00 ); INSERT 0 1 --查看audit表数据。 gaussdb=# SELECT * FROM audit; emp_id | entry_date --------+------------------------------- 1 | 2024-12-09 11:25:55.992644+08 (1 row)
- 修改触发器
GaussDB提供了ALTER TRIGGER 语句,用于修改触发器。
--修改触发器的名称。 gaussdb=# ALTER TRIGGER example_trigger ON company RENAME TO example_trigger1; ALTER TRIGGER
默认创建的触发器处于启用状态,可以使用以下语句禁用或者启用某个触发器。
--触发器的禁用。 gaussdb=# ALTER TABLE company DISABLE TRIGGER example_trigger1; ALTER TABLE --向company表中插入数据,查看audit表。 gaussdb=# INSERT INTO company (ID,NAME,AGE,ADDRESS,SALARY) VALUES (2, '李四', 30, '安徽', 30000.00 ); INSERT 0 1 gaussdb=# SELECT * FROM audit; emp_id | entry_date --------+------------------------------- 1 | 2024-12-09 11:25:55.992644+08 (1 row) --触发器的启用。 gaussdb=# ALTER TABLE company ENABLE TRIGGER example_trigger1 ;
- 查看触发器
视图information_schema.triggers中存储了关于触发器的信息。
--使用如下元命令使查询结果竖行回显。 gaussdb=# \x Expanded display is on. gaussdb=# SELECT * FROM information_schema.triggers WHERE trigger_name = 'example_trigger1'; -[ RECORD 1 ]--------------+--------------------------------- trigger_catalog | postgres trigger_schema | public trigger_name | example_trigger1 event_manipulation | INSERT event_object_catalog | postgres event_object_schema | public event_object_table | company action_order | action_condition | action_statement | EXECUTE PROCEDURE auditlogfunc() action_orientation | ROW action_timing | AFTER action_reference_old_table | action_reference_new_table | action_reference_old_row | action_reference_new_row | created | gaussdb=# \x Expanded display is off.
- 删除触发器
gaussdb=# DROP TRIGGER example_trigger1 ON company; DROP TRIGGER --删除表。 gaussdb=# DROP TABLE company; DROP TABLE gaussdb=# DROP TABLE audit; DROP TABLE