psql 08表 觸發器

2022-03-11 00:16:02 字數 3978 閱讀 3251

語句級觸發器與行為觸發器

//建立乙個對student表的操作記錄表

create table log(

update_time timestamp, //操作時間

db_user varchar(40), //操作的資料庫使用者名稱

opr_type varchar(6) //操作型別

);//建立觸發器函式

create function log_trigger()

returns trigger as

$$begin

insert into log values(now(), user, tg_op); //user即為當前使用者名稱; to_op是觸發器函式中的特殊變數,代表dml操作型別

return null;

end;

$$language 'plpgsql';

//建立乙個語句級觸發器

create trigger log_trigger

after insert or delete or update on student

for statement execute procedure log_trigger(); //statement

之後乙個sql語句無論是插入多條資料,刪除多條資料或者更新刪除不存在的資料;只要執行成功乙個sql語句,就會觸發一次;

create trigger log_trigger2

after insert or delete or update on student

for row execute procedure log_trigger();

before觸發器和after觸發器
//before觸發器可以直接修改new值以改變實際的更新值

create function student_new_name_trigger()

returns trigger as

' //$$

begin

new.student_name = new.student_name || new.student_no;

return new;

end;

' //$$

language 'plpgsql';

//create trigger new_name_trigger

before insert or update on student

for each row execute procedure student_new_name_trigger();

//儲存的資料student_name會變成要輸入的值拼接上student_no

觸發器的行為建立事件觸發器
//乙個禁止所有ddl語句的例子

create or replace function abort_any_command()

returns event_trigger

language plpgsql

as $$

begin

raise exception 'command % is disabled', tg_tag;

end;

$$;//

create event trigger abort_ddl on ddl_command_start

execute procedure abort_any_command();

//在postgresq中truncate事件是使用普通觸發器觸發的,事件觸發器不會觸發truncate table;

//禁止上面定義的事件觸發器

alter event trigger abort_ddl disable;

變數

修改事件觸發器

alter event trigger name [disable | enable];

alter event trigger name enable [replica | always];

alter event trigger name owner to new_owner;

alter event trigger name rename to new_name;

事件觸發器記錄資料庫中物件刪除的審計日誌
//記錄資訊表

create table log_drop_objects (

op_time timestamp,

ddl_tag text,

classid oid,

objid oid,

objectsubid oid,

object_type text,

schme_name text,

object_name text,

object_identity text

);//

create function event_trigger_log_drops()

returns event_trigger

language plpgsql as

$$declare

obj record;

begin

insert into log_drop_objects select now(), tg_tag, classid, objid, objsubid, object_type,

schema_name, object_name, object_identity from pg_event_trigger_dropped_objects();

end$$;

//create event trigger event_trigger_log_drops

on sql_drop

execute procedure event_trigger_log_drops();

//建立一張測試表

create table test (id int primary key, note varchar(20));

//修改欄位或刪除表再檢視記錄表中的記錄

alter table test drop column note;

使用
create tablespace tablespace_name [owner user_name] location 'directory';

//create tablespace tbs_data location '/data/pgdata';

create database db01 set tablespace tbs_data;
//在此操作時保證沒有其他人連線此資料庫,否則會報錯;

alter database db01 set tablespace tbs_data;

//資料中已經有的表的表空間不會改變;

create table test01 (id int, note text) tablespace tbs_data;
create index idx_test01_id on test01(id) tablespace tbs_data;
alter table test01 add constraint unique_test01_id unique(id) using index tablespace tbs_data;
alter table test01 add constraint pk_test01_id primary key(id) using index tablespace tbs_data;
//注意在移動表時候會鎖表,此時所有對錶的操作都會被阻塞;

alter table test01 set tablespace pg_default;

mysql 觸發器 臨時表 Mysql觸發器

mysql觸發器 1.建立觸發器 注意 觸發器只能建立在永久表上,不能對臨時表建立觸發器,語法如下 create trigger trigger name trigger time trigger event on table name for each row trigger stmt trigg...

觸發器 mysql觸發器

觸發器是一種特殊的儲存過程,它在插入 刪除或修改特定表中的資料時觸發執行,它比資料庫本身標準的功能有更精細和更複雜的資料控制能力。和儲存過程一樣,很少使用。1 觸發器的作用 2 建立觸發器 建立測試環境 mysql create database test db query ok,1 row aff...

觸發器(五 復合觸發器)

oracle11g開始提供了一種復合觸發器,簡單的說就是支援把語句級和行級觸發器組合在一起。實際應用場景不多,這裡就做個記錄。與單個觸發器語法有所區別 1.單個觸發器的頭部是 before after 動作 on 物件 for 觸發級別 而組合觸發器的頭部是 for 動作 on 物件 compoun...