數(shù)據(jù)庫觸發(fā)器有下面的作用:
成都創(chuàng)新互聯(lián)于2013年開始,先為寶清等服務(wù)建站,寶清等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為寶清企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。
1.安全性。能夠基于數(shù)據(jù)庫的值使用戶具有操作數(shù)據(jù)庫的某種權(quán)利。
# 能夠基于時(shí)間限制用戶的操作,比如不同意下班后和節(jié)假日改動數(shù)據(jù)庫數(shù)據(jù)。
2.審計(jì)。能夠跟蹤用戶對數(shù)據(jù)庫的操作。???
# 審計(jì)用戶操作數(shù)據(jù)庫的語句。
# 把用戶對數(shù)據(jù)庫的更新寫入審計(jì)表。
3.實(shí)現(xiàn)復(fù)雜的數(shù)據(jù)完整性規(guī)則
# 實(shí)現(xiàn)非標(biāo)準(zhǔn)的數(shù)據(jù)完整性檢查和約束。觸發(fā)器可產(chǎn)生比規(guī)則更為復(fù)雜的限制。與規(guī)則不同,觸發(fā)器能夠引用列或數(shù)據(jù)庫對象。比如,觸發(fā)器可回退不論什么企圖吃進(jìn)超過自己保證金的期貨。
# 提供可變的缺省值。
4.實(shí)現(xiàn)復(fù)雜的非標(biāo)準(zhǔn)的數(shù)據(jù)庫相關(guān)完整性規(guī)則。觸發(fā)器能夠?qū)?shù)據(jù)庫中相關(guān)的表進(jìn)行連環(huán)更新。比如,在auths表author_code列上的刪除觸發(fā)器可導(dǎo)致對應(yīng)刪除在其他表中的與之匹配的行。
# 在改動或刪除時(shí)級聯(lián)改動或刪除其他表中的與之匹配的行。
# 在改動或刪除時(shí)把其他表中的與之匹配的行設(shè)成NULL值。
# 在改動或刪除時(shí)把其他表中的與之匹配的行級聯(lián)設(shè)成缺省值。
# 觸發(fā)器可以拒絕或回退那些破壞相關(guān)完整性的變化,取消試圖進(jìn)行數(shù)據(jù)更新的事務(wù)。當(dāng)插入一個(gè)與其主健不匹配的外部鍵時(shí),這樣的觸發(fā)器會起作用。比如,可以在books.author_code?列上生成一個(gè)插入觸發(fā)器,假設(shè)新值與auths.author_code列中的某值不匹配時(shí),插入被回退。
5.同步實(shí)時(shí)地復(fù)制表中的數(shù)據(jù)。
6.自己主動計(jì)算數(shù)據(jù)值,假設(shè)數(shù)據(jù)的值達(dá)到了一定的要求,則進(jìn)行特定的處理
語法如下:
CREATE TRIGGER trigger_name trigger_time trigger_event
ON tbl_name FOR EACH ROW trigger_stmt
觸發(fā)程序是與表有關(guān)的命名數(shù)據(jù)庫對象,當(dāng)表上出現(xiàn)特定事件時(shí),將激活該對象。
觸發(fā)程序與命名為tbl_name的表相關(guān)。tbl_name必須引用永久性表。不能將觸發(fā)程序與臨時(shí)表表或視圖關(guān)聯(lián)起來。
trigger_time是觸發(fā)程序的動作時(shí)間。它可以是BEFORE或AFTER,以指明觸發(fā)程序是在激活它的語句之前或之后觸發(fā)。
trigger_event指明了激活觸發(fā)程序的語句的類型。trigger_event可以是下述值之一:
· INSERT:將新行插入表時(shí)激活觸發(fā)程序,例如,通過INSERT、LOAD DATA和REPLACE語句
mysql用觸發(fā)器禁止某條記錄的刪除、修改:
delimiter //
CREATE TRIGGER xx_company_agent_update? BEFORE UPDATE ON xx_company_agent
FOR EACH ROW
BEGIN
IF OLD.bank_card is not null THEN
SET NEW.bank_card = OLD.bank_card,NEW.money= OLD.money,NEW.real_money=OLD.real_money,NEW.bank_name=OLD.bank_name;
END IF;
END;//
delimiter ;
擴(kuò)展資料
mysql觸發(fā)器的使用
用戶記錄用戶的預(yù)期事件(schema是特殊用戶的數(shù)據(jù)庫對象集合。這些對象包括:表,索引,視圖,存儲程序等。在Oracle里, schema要求創(chuàng)建一個(gè)用戶。但是也可以創(chuàng)建一個(gè)沒有schema的用戶(根本沒有對象)。
所以在Oracle-中,用戶就是一個(gè)帳戶而schema就是對象。可能在其他的數(shù)據(jù)庫平臺上可以創(chuàng)建一個(gè)沒有用戶的schema。LOGOFF不能是AFTER LOGOFF,將會重新操作,這里應(yīng)該是BEFORE,否則就會報(bào)錯(cuò):替換可以插入不能有AFTER。創(chuàng)建或替換觸發(fā)器MYLOGOFFTRIGGER。
參考資料來源:百度百科—mySQL
語法說明如下。
1) 觸發(fā)器名
觸發(fā)器的名稱,觸發(fā)器在當(dāng)前數(shù)據(jù)庫中必須具有唯一的名稱。如果要在某個(gè)特定數(shù)據(jù)庫中創(chuàng)建,名稱前面應(yīng)該加上數(shù)據(jù)庫的名稱。
2) INSERT | UPDATE | DELETE
觸發(fā)事件,用于指定激活觸發(fā)器的語句的種類。
注意:三種觸發(fā)器的執(zhí)行時(shí)間如下。INSERT:將新行插入表時(shí)激活觸發(fā)器。例如,INSERT 的 BEFORE 觸發(fā)器不僅能被 MySQL 的 INSERT 語句激活,也能被 LOAD DATA 語句激活。DELETE: 從表中刪除某一行數(shù)據(jù)時(shí)激活觸發(fā)器,例如 DELETE 和 REPLACE 語句。UPDATE:更改表中某一行數(shù)據(jù)時(shí)激活觸發(fā)器,例如 UPDATE 語句。
3) BEFORE | AFTER
BEFORE 和 AFTER,觸發(fā)器被觸發(fā)的時(shí)刻,表示觸發(fā)器是在激活它的語句之前或之后觸發(fā)。若希望驗(yàn)證新數(shù)據(jù)是否滿足條件,則使用 BEFORE 選項(xiàng);若希望在激活觸發(fā)器的語句執(zhí)行之后完成幾個(gè)或更多的改變,則通常使用 AFTER 選項(xiàng)。
4) 表名
與觸發(fā)器相關(guān)聯(lián)的表名,此表必須是永久性表,不能將觸發(fā)器與臨時(shí)表或視圖關(guān)聯(lián)起來。在該表上觸發(fā)事件發(fā)生時(shí)才會激活觸發(fā)器。同一個(gè)表不能擁有兩個(gè)具有相同觸發(fā)時(shí)刻和事件的觸發(fā)器。例如,對于一張數(shù)據(jù)表,不能同時(shí)有兩個(gè) BEFORE UPDATE 觸發(fā)器,但可以有一個(gè) BEFORE UPDATE 觸發(fā)器和一個(gè) BEFORE INSERT 觸發(fā)器,或一個(gè) BEFORE UPDATE 觸發(fā)器和一個(gè) AFTER UPDATE 觸發(fā)器。
5) 觸發(fā)器主體
觸發(fā)器動作主體,包含觸發(fā)器激活時(shí)將要執(zhí)行的 MySQL 語句。如果要執(zhí)行多個(gè)語句,可使用 BEGIN…END 復(fù)合語句結(jié)構(gòu)。
有時(shí)候在修改某一個(gè)字段的值得時(shí)候我們需要根據(jù)當(dāng)前字段的不同狀態(tài)進(jìn)行不同處理,
比如對于用戶表,我們需要記錄下來用戶被訪問的次數(shù),但訪問次數(shù)的初始值為 null。
如下:
CREATE TABLE `test` (
`id` ?int(11) NULL DEFAULT NULL ,
`name` ?varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
`visit_num` ?int(11) NULL DEFAULT NULL
)
我們就可以使用如下的 sql 進(jìn)行判斷和修改
UPDATE test set visit_age=if(visit_num is null,1,visit_num+1) where id=1。
1、首先寫建立觸發(fā)器的sql語句:
1)插入時(shí)的:
CREATE TRIGGER insertref BEFORE INSERT ON a
FOR EACH ROW BEGIN
UPDATE b SET registerStatus =1 WHERE NEW.id = id and NEW.received is not null and NEW.received !='';
update b set registerIP=NEW.received where NEW.id = id;
end
2)刪除時(shí):
CREATE TRIGGER deleteref BEFORE DELETE ON a
FOR EACH ROW begin
update b set registerStatus =0 WHERE OLD.id = id;
update b set registerIP=NULL where OLD.id = id;
end
3)更新時(shí):
CREATE TRIGGER updateref BEFORE UPDATE ON a
FOR EACH ROW BEGIN
update b set registerIP=NEW.received where OLD.id=id;
end