語句級觸發器與行為觸發器
//建立乙個對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...