PostgreSQL創(chuàng)建觸發(fā)器的實現(xiàn)示例
入門
簡介
PostgreSQL 的 觸發(fā)器 Trigger 是一類特殊的數(shù)據(jù)庫對象,在表的 INSERT、UPDATE 或 DELETE 事件發(fā)生時,自動執(zhí)行預(yù)定義的函數(shù)(觸發(fā)器函數(shù))。它常用于 數(shù)據(jù)完整性約束、審計日志、自動計算、復(fù)雜的業(yè)務(wù)邏輯處理等場景
觸發(fā)器的構(gòu)成
一個完整的觸發(fā)器由兩個部分組成:
觸發(fā)器函數(shù)(Trigger Function):觸發(fā)器執(zhí)行的具體邏輯,必須返回 TRIGGER 類型
觸發(fā)器(Trigger):綁定到表的某個事件上,調(diào)用觸發(fā)器函數(shù)
觸發(fā)器的類型
按照觸發(fā)時間分類
- BEFORE 觸發(fā)器(在事件發(fā)生前執(zhí)行)
- AFTER 觸發(fā)器(在事件發(fā)生后執(zhí)行)
- INSTEAD OF 觸發(fā)器(替代事件執(zhí)行,僅適用于視圖)
按照觸發(fā)事件分類
- INSERT 觸發(fā)器(在插入新數(shù)據(jù)時觸發(fā))
- UPDATE 觸發(fā)器(在數(shù)據(jù)更新時觸發(fā))
- DELETE 觸發(fā)器(在數(shù)據(jù)刪除時觸發(fā))
- TRUNCATE 觸發(fā)器(在
TRUNCATE操作時觸發(fā))
按照觸發(fā)級別分類
- 行級觸發(fā)器(FOR EACH ROW):對受影響的每一行數(shù)據(jù)觸發(fā)一次
- 語句級觸發(fā)器(FOR EACH STATEMENT):對整個 SQL 語句僅觸發(fā)一次
創(chuàng)建觸發(fā)器
簡介
PostgreSQL 觸發(fā)器的創(chuàng)建需要兩步:
- 編寫觸發(fā)器函數(shù)(必須返回
TRIGGER類型) - 創(chuàng)建觸發(fā)器 并綁定到表
假設(shè)我們有一個 users 表,我們希望在有新用戶插入時,自動記錄日志到 user_logs 表中
示例 1:審計日志
Step 1: 創(chuàng)建審計日志表
CREATE TABLE user_logs (
log_id SERIAL PRIMARY KEY,
user_id UUID,
action TEXT,
log_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Step 2: 編寫觸發(fā)器函數(shù)
CREATE OR REPLACE FUNCTION log_user_insert() RETURNS TRIGGER AS $$
BEGIN
INSERT INTO user_logs (user_id, action)
VALUES (NEW.id, 'User created');
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
Step 3: 創(chuàng)建觸發(fā)器
CREATE TRIGGER user_insert_trigger AFTER INSERT ON users FOR EACH ROW EXECUTE FUNCTION log_user_insert();
示例 2:自動更新修改時間
假設(shè) users 表中有一個 updated_at 字段,我們希望在用戶數(shù)據(jù)更新時,自動更新 updated_at 時間戳。
Step 1: 在 users 表添加 updated_at 字段
ALTER TABLE users ADD COLUMN updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP;
Step 2: 創(chuàng)建觸發(fā)器函數(shù)
CREATE OR REPLACE FUNCTION update_timestamp() RETURNS TRIGGER AS $$
BEGIN
NEW.updated_at = CURRENT_TIMESTAMP;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
Step 3: 創(chuàng)建觸發(fā)器
CREATE TRIGGER update_users_timestamp BEFORE UPDATE ON users FOR EACH ROW EXECUTE FUNCTION update_timestamp();
示例 3:防止 DELETE
有時我們不希望某些重要數(shù)據(jù)被刪除,可以通過 BEFORE DELETE** 觸發(fā)器阻止刪除**。
Step 1: 創(chuàng)建觸發(fā)器函數(shù)
CREATE OR REPLACE FUNCTION prevent_delete() RETURNS TRIGGER AS $$
BEGIN
RAISE EXCEPTION '不允許刪除數(shù)據(jù)!';
END;
$$ LANGUAGE plpgsql;
Step 2: 綁定到 users 表
CREATE TRIGGER prevent_users_deletion BEFORE DELETE ON users FOR EACH ROW EXECUTE FUNCTION prevent_delete();
觸發(fā)器的管理
查看已有觸發(fā)器
SELECT tgname, relname, tgtype, proname FROM pg_trigger JOIN pg_class ON pg_trigger.tgrelid = pg_class.oid JOIN pg_proc ON pg_trigger.tgfoid = pg_proc.oid WHERE NOT tgisinternal;
刪除觸發(fā)器
DROP TRIGGER IF EXISTS user_insert_trigger ON users;
刪除觸發(fā)器函數(shù)
DROP FUNCTION IF EXISTS log_user_insert();
到此這篇關(guān)于PostgreSQL創(chuàng)建觸發(fā)器的實現(xiàn)示例的文章就介紹到這了,更多相關(guān)PostgreSQL創(chuàng)建觸發(fā)器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
postgresql數(shù)據(jù)添加兩個字段聯(lián)合唯一的操作
這篇文章主要介紹了postgresql數(shù)據(jù)添加兩個字段聯(lián)合唯一的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02
PostgreSQL數(shù)據(jù)庫部署linux服務(wù)器完整教程
本文主要述了在Linux服務(wù)器上部署PostgreSQL數(shù)據(jù)庫的過程,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2026-05-05
PostgreSQL三種自增列sequence,serial,identity的用法區(qū)別
這篇文章主要介紹了PostgreSQL三種自增列sequence,serial,identity的用法區(qū)別,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02
使用PostgreSQL為表或視圖創(chuàng)建備注的操作
這篇文章主要介紹了使用PostgreSQL為表或視圖創(chuàng)建備注的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01
pgsql之pg_stat_replication的使用詳解
這篇文章主要介紹了pgsql之pg_stat_replication的使用詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01
psql 執(zhí)行文件 permission denied的解決
這篇文章主要介紹了psql 執(zhí)行文件 permission denied的解決,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01

