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