PostgreSQL觸發器
PostgreSQL的觸發器是數據庫自動執行指定的數據庫事件發生時調用的回調函數。以下是有關PostgreSQL的觸發器的要點:
-
PostgreSQL的觸發可以指定觸發操作前嘗試一行(在檢查約束之前INSERT,UPDATE或DELETE)或操作完成後(在檢查約束之後和INSERT,UPDATE或DELETE(刪除)已完成),或替代的操作(在視圖上插入,更新或刪除的情況下)..
-
FOR EACH ROW觸發器被標記的操作修改的每一行被稱為一次。相比之下,FOR EACH STATEMENT觸發器為隻執行一次對於任何給定的操作,不管它有多少行修改。
-
WHEN子句和觸發器動作可能訪問的行元素被插入,刪除或更新使用的形式NEW.column-name和OLD.column-name,其中列名是從表中的列名的引用該觸發器相關聯的。
-
如果提供WHEN子句,PostgreSQL的報表隻執行WHEN子句為true的行。如果冇有提供WHEN子句,PostgreSQL的語句執行的所有行。
-
如果有多個相同類型的觸發器定義了相同的事件,他們將被觸發名稱是按字母順序排列。
-
BEFORE,AFTER或INSTEAD OF關鍵字決定何時觸發動作將被執行,相對於插入,修改或移除相關的行。
-
觸發器表,它們與丟棄時自動刪除。
-
要修改的表必須存在,在同一數據庫中的表或視圖,觸發器被附加,必須使用表名而不使用database.tablename。
-
約束時指定的選項創建一個約束觸發器。這是一個普通的觸發器除外,可以調整使用SET(設定)約束的觸發器觸發的定時相同。預計約束觸發器違反他們所實施的限製時引發異常..
語法:
創建觸發器的基本語法如下:
CREATE TRIGGER trigger_name [BEFORE|AFTER|INSTEAD OF] event_name ON table_name [ -- Trigger logic goes here.... ];
Here event_name could be INSERT, DELETE, UPDATE, and TRUNCATE database operation on the mentioned table table_name. You can optionally specify FOR EACH ROW after table name.
Following is the syntax of creating a trigger on an UPDATE operation on one or more specified columns of a table as follows:
CREATE TRIGGER trigger_name [BEFORE|AFTER] UPDATE OF column_name ON table_name [ -- Trigger logic goes here.... ];
例子
讓我們考慮一個情況下,我們要保持審核COMPANY表中的每一條記錄被插入,我們將創建新如下(如果已經創建過,那麼刪除COMPANY表)
testdb=# CREATE TABLE COMPANY( ID INT PRIMARY KEY NOT NULL, NAME TEXT NOT NULL, AGE INT NOT NULL, ADDRESS CHAR(50), SALARY REAL );
為了保持審核的測試,我們將創建一個新的表被稱為審計將被插入日誌消息每當有一個新的記錄條目表COMPANY:
testdb=# CREATE TABLE AUDIT( EMP_ID INT NOT NULL, ENTRY_DATE TEXT NOT NULL );
這裡的ID是審計記錄ID,EMP_ID的ID來自COMPANY表,日期將保持公司表時的記錄將被創建時間戳。所以,現在讓我們創建一個觸發器,COMPANY 表如下:
testdb=# CREATE TRIGGER example_trigger AFTER INSERT ON COMPANY FOR EACH ROW EXECUTE PROCEDURE auditlogfunc();
auditlogfunc()是一個PostgreSQL的過程,有以下定義:
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;
現在,讓我們開始COMPANY 表插入記錄,這將導致在審核表中創建審計日誌記錄。因此,讓我們創建一個COMPANY 表記錄如下:
testdb=# INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) VALUES (1, 'Paul', 32, 'California', 20000.00 );
這將創建一個記錄COMPANY 表如下:
id | name | age | address | salary ----+------+-----+--------------+-------- 1 | Paul | 32 | California | 20000
同時審核表中創建一條記錄。這條記錄是一個觸發我們已經創建了COMPANY 表上的INSERT操作的結果。類似的方式,也可以創建觸發器,UPDATE和DELETE操作根據要求。
emp_id | entry_date --------+------------------------------- 1 | 2013-05-05 15:49:59.968+05:30 (1 row)
列出觸發器
可以列出當前數據庫中的所有觸發器從pg_trigger表如下:
testdb=# SELECT * FROM pg_trigger;
以上PostgreSQL的表會列出所有觸發器。
如果要列出特定表上的觸發器,然後使用條款與表名如下:
testdb=# SELECT tgname FROM pg_trigger, pg_class WHERE tgrelid=pg_class.oid AND relname='company';
以上PostgreSQL的表也會列出隻有一個條目如下:
tgname ----------------- example_trigger (1 row)
刪除觸發器
以下是DROP命令可以用來刪除一個現有的觸發:
testdb=# DROP TRIGGER trigger_name;