PostgreSQL触发器的使用
原文:?https://www.yiibai.com/postgresql/postgresql-trigger.html
?
?
?
------------------------------------------------------------------------------------------------------------------------------
PostgreSQL觸發(fā)器是一組動作或數(shù)據(jù)庫回調函數(shù),它們在指定的表上執(zhí)行指定的數(shù)據(jù)庫事件(即,INSERT,UPDATE,DELETE或TRUNCATE語句)時自動運行。 觸發(fā)器用于驗證輸入數(shù)據(jù),執(zhí)行業(yè)務規(guī)則,保持審計跟蹤等。
觸發(fā)器的重點知識
PostgreSQL在以下情況下執(zhí)行/調用觸發(fā)器:在嘗試操作之前(在檢查約束并嘗試INSERT,UPDATE或DELETE之前)。或者在操作完成后(在檢查約束并且INSERT,UPDATE或DELETE完成后)。或者不是操作(在視圖中INSERT,UPDATE或DELETE的情況下)
對于操作修改的每一行,都會調用一個標記為FOR EACH ROWS的觸發(fā)器。 另一方面,標記為FOR EACH STATEMENT的觸發(fā)器只對任何給定的操作執(zhí)行一次,而不管它修改多少行。
您可以為同一事件定義同一類型的多個觸發(fā)器,但條件是按名稱按字母順序觸發(fā)。
PostgreSQL創(chuàng)建觸發(fā)器
CREATE TRIGGER語句用于在PostgreSQL表中創(chuàng)建一個新的觸發(fā)器。 當表發(fā)生特定事件(即INSERT,UPDATE和DELETE)時,它被激活。
語法
CREATE TRIGGER trigger_name [BEFORE|AFTER|INSTEAD OF] event_name ON table_name [ -- Trigger logic goes here.... ]; SQL在這里,event_name可以是INSERT,UPDATE,DELETE和TRUNCATE數(shù)據(jù)庫操作上提到的表table_name。 您可以選擇在表名后指定FOR EACH ROW。
下面來看看看如何在INSERT操作中創(chuàng)建觸發(fā)器的語法。
CREATE TRIGGER trigger_name AFTER INSERT ON column_name ON table_name [ -- Trigger logic goes here.... ]; SQL觸發(fā)器例子
下面舉個例子來演示PostgreSQL在INSERT語句之后創(chuàng)建觸發(fā)器。在以下示例中,我們對每個記錄插入到COMPANY表中進行審核(審計)。
使用以下查詢創(chuàng)建一個名為COMPANY的表:
CREATE TABLE COMPANY( ID INT PRIMARY KEY NOT NULL, NAME TEXT NOT NULL, AGE INT NOT NULL, ADDRESS CHAR(50), SALARY REAL ); SQL為了保存審計/審核,我們將創(chuàng)建一個名為AUDIT的新表,只要在COMPANY表中有一個新記錄的條目,就會插入日志消息。
使用以下查詢語句創(chuàng)建另一個表Audit:
CREATE TABLE AUDIT( EMP_ID INT NOT NULL, ENTRY_DATE TEXT NOT NULL ); SQL在COMPANY表上創(chuàng)建觸發(fā)器之前,首先創(chuàng)建一個名為auditlogfunc()的函數(shù)/過程。
執(zhí)行以下查詢語句來創(chuàng)建函數(shù)/過程:
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; SQL執(zhí)行結果如下所示-
現(xiàn)在通過使用以下查詢語句在COMPANY表上創(chuàng)建一個觸發(fā)器:
CREATE TRIGGER example_trigger AFTER INSERT ON COMPANY FOR EACH ROW EXECUTE PROCEDURE auditlogfunc(); SQL執(zhí)行結果如下所示-
向COMPANY表中插入一些數(shù)據(jù)記錄,以驗證觸發(fā)器執(zhí)行情況。
INSERT INTO COMPANY VALUES(1, '小米科技', 8, '北京市朝陽區(qū)', 9999); INSERT INTO COMPANY VALUES(2, '京東中科', 6, '廣州市天河區(qū)', 8999); SQL在執(zhí)行上面兩條插入語句后,現(xiàn)我們來看AUDIT表是否有自動插入兩條審核記錄。
可以確定的是在插入數(shù)據(jù)后觸發(fā)了觸發(fā)器,PostgreSQL也自動向AUDIT表中創(chuàng)建/插入兩個記錄。 這些記錄是觸發(fā)的結果,這是因為我們在AFTER INSERT on COMPANY表上創(chuàng)建了這些記錄。
PostgreSQL觸發(fā)器的使用
PostgreSQL觸發(fā)器可用于以下目的:
- 驗證輸入數(shù)據(jù)。
- 執(zhí)行業(yè)務規(guī)則。
- 為不同文件中新插入的行生成唯一值。
- 寫入其他文件以進行審計跟蹤。
- 從其他文件查詢交叉引用目的。
- 訪問系統(tǒng)函數(shù)。
- 將數(shù)據(jù)復制到不同的文件以實現(xiàn)數(shù)據(jù)一致性。
使用觸發(fā)器的優(yōu)點
- 它提高了應用程序的開發(fā)速度。 因為數(shù)據(jù)庫存儲觸發(fā)器,所以您不必將觸發(fā)器操作編碼到每個數(shù)據(jù)庫應用程序中。
- 全局執(zhí)法業(yè)務規(guī)則。定義觸發(fā)器一次,然后將其重用于使用數(shù)據(jù)庫的任何應用程序。
- 更容易維護 如果業(yè)務策略發(fā)生變化,則只需更改相應的觸發(fā)程序,而不是每個應用程序。
- 提高客戶/服務器環(huán)境的性能。 所有規(guī)則在結果返回之前在服務器中運行
總結
以上是生活随笔為你收集整理的PostgreSQL触发器的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java面试-Java并发编程(九)——
- 下一篇: 【计算机本科补全计划】Mysql 学习小