国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > MySQL > 正文

MySQL-觸發(fā)器

2024-07-24 12:35:13
字體:
供稿:網(wǎng)友
         MySQL-觸發(fā)器:

  一、觸發(fā)器
  觸發(fā)器(TRIGGER)是MySQL的數(shù)據(jù)庫對象之一,從5.0.2版本開始支持。該對象與編程語言中的函數(shù)非常類似,都需要聲明、執(zhí)行等。但是觸發(fā)器的執(zhí)行不是由程序調(diào)用,也不是由手工啟動,而是由事件來觸發(fā)、激活從而實現(xiàn)執(zhí)行。有點類似DOM中的事件。
  觸發(fā)器是由事件觸發(fā),事件包括增,刪,改操作,當(dāng)數(shù)據(jù)庫執(zhí)行這些操作時,會激活觸發(fā)器執(zhí)行相應(yīng)的操作
 
  創(chuàng)建觸發(fā)器的語法
  CREATE TRIGGER trigger_name trigger_time trigger_event
  ON tb_name FOR EACH ROW trigger_stmt
  trigger_name:觸發(fā)器名稱
  tirgger_time:觸發(fā)執(zhí)行事件
      BEFORE:事件之前觸發(fā)
      AFTER:事件之后觸發(fā)
  trigger_event:觸發(fā)事件
      INSERT:插入某一行時激活觸發(fā)器,INSERT,LOAD DATA,REPLACE語句可以觸發(fā)
      UPDATE:更改某一行時激活觸發(fā)器,UPDATE語句可以觸發(fā)
      DELETE:刪除某一行時激活觸發(fā)器,DELETE,REPLACE語句可以觸發(fā)
  tb_name:觸發(fā)器要執(zhí)行的哪張表
  FOR EACH ROW:觸發(fā)頻率為每一行觸發(fā)一次
  trigger_stmt:觸發(fā)器的程序體,可以是一條SQL語句或者是用BEGIN和END包含的多條語句
  1、創(chuàng)建只有一個執(zhí)行語句的觸發(fā)器
  CREATE TRIGGER 觸發(fā)器名 BEFORE|AFTER 觸發(fā)事件 ON 表名 FOR EACH ROW 執(zhí)行語句;
  2、創(chuàng)建有多個執(zhí)行語句的觸發(fā)器
  CREATE TRIGGER 觸發(fā)器名 BEFORE|AFTER 觸發(fā)事件
  ON 表名 FOR EACH ROW
  BEGIN
          執(zhí)行語句列表
  END;
  MySQL默認(rèn)是以 ;作為結(jié)束執(zhí)行符號,與觸發(fā)器執(zhí)行語句列表中需要的分行起沖突,為解決此問題可用DELIMITER,如DELIMITER || ,就是將結(jié)束符號變成||。
 
  DELIMITER ||
  CREATE TRIGGER 觸發(fā)器名 BEFORE|AFTER 觸發(fā)事件
  ON 表名 FOR EACH ROW
  BEGIN
          執(zhí)行語句列表
  END ||
  DELIMITER;
  3、NEW和OLD
  MySQL中定義了NEW和OLD,用來記錄發(fā)生變化的內(nèi)容,具體為:
  INSERT:NEW用來表示將要(BEFORE)或已經(jīng)(AFTER)插入的新數(shù)據(jù);
  UPDATE:OLD用來表示將要或已經(jīng)被修改的原數(shù)據(jù),NEW用來表示將要或已經(jīng)修改為的新數(shù)據(jù);
  DELETE:OLD用來表示將要或已經(jīng)被刪除的原數(shù)據(jù);
  使用方法: NEW.columnName (columnName 為相應(yīng)數(shù)據(jù)表某一列名)
 
  4、示例
  創(chuàng)建用戶(users)表,日志(logs)表
 
  CREATE TABLE `users` (
    `id` int(20) not null auto_increment primary key,
    `name` varchar(255)
  );
 
  CREATE TABLE `logs` (
    `nid` int(20) not null auto_increment primary key,
    `log` varchar(255)
  );
  創(chuàng)建觸發(fā)器(每添加一個用戶,就記錄一條日志)
 
  delimiter //
  create trigger user_log after insert on users for each row
  begin
  insert into logs(log) values(new.name);
  end //
  delimiter ;
  使用觸發(fā)器
  觸發(fā)器無法由用戶直接調(diào)用,而知由于對表的【增/刪/改】操作被動引發(fā)的。
 
  insert into users(name) values('admin');
  查看觸發(fā)器
  SHOW TRIGGERS語句查看觸發(fā)器信息
 
  刪除觸發(fā)器
 
  drop trigger user_log;
  5、觸發(fā)器的作用
  數(shù)據(jù)庫觸發(fā)器有以下的作用:
  1.安全性。可以基于數(shù)據(jù)庫的值使用戶具有操作數(shù)據(jù)庫的某種權(quán)利。
    可以基于時間限制用戶的操作,例如不允許下班后和節(jié)假日修改數(shù)據(jù)庫數(shù)據(jù)。
    可以基于數(shù)據(jù)庫中的數(shù)據(jù)限制用戶的操作,例如不允許股票的價格的升幅一次超過10%。
  2.審計。可以跟蹤用戶對數(shù)據(jù)庫的操作。   
    審計用戶操作數(shù)據(jù)庫的語句。
    把用戶對數(shù)據(jù)庫的更新寫入審計表。
  3.實現(xiàn)復(fù)雜的數(shù)據(jù)完整性規(guī)則
    實現(xiàn)非標(biāo)準(zhǔn)的數(shù)據(jù)完整性檢查和約束。觸發(fā)器可產(chǎn)生比規(guī)則更為復(fù)雜的限制。與規(guī)則不同,觸發(fā)器可以引用列或數(shù)據(jù)庫對象。例如,觸發(fā)器可回退任何企圖吃進(jìn)超過自己保證金的期貨。
    提供可變的缺省值。
  4.實現(xiàn)復(fù)雜的非標(biāo)準(zhǔn)的數(shù)據(jù)庫相關(guān)完整性規(guī)則。觸發(fā)器可以對數(shù)據(jù)庫中相關(guān)的表進(jìn)行連環(huán)更新。例如,在auths表author_code列上的刪除觸發(fā)器可導(dǎo)致相應(yīng)刪除在其它表中的與之匹配的行。
    在修改或刪除時級聯(lián)修改或刪除其它表中的與之匹配的行。
    在修改或刪除時把其它表中的與之匹配的行設(shè)成NULL值。
    在修改或刪除時把其它表中的與之匹配的行級聯(lián)設(shè)成缺省值。
    觸發(fā)器能夠拒絕或回退那些破壞相關(guān)完整性的變化,取消試圖進(jìn)行數(shù)據(jù)更新的事務(wù)。當(dāng)插入一個與其主健不匹配的外部鍵時,這種觸發(fā)器會起作用。例如,可以在books.author_code 列上生成一個插入觸發(fā)器,如果新值與auths.author_code列中的某值不匹配時,插入被回退。
  5.同步實時地復(fù)制表中的數(shù)據(jù)。
  6.自動計算數(shù)據(jù)值,如果數(shù)據(jù)的值達(dá)到了一定的要求,則進(jìn)行特定的處理。例如,如果公司的帳號上的資金低于5萬元則立即給財務(wù)人員發(fā)送警告數(shù)據(jù)。

(編輯:武林網(wǎng))

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 时尚| 万载县| 井冈山市| 竹北市| 中卫市| 当雄县| 昔阳县| 延长县| 凤山市| 明光市| 蓬莱市| 罗江县| 大余县| 新河县| 万年县| 化隆| 出国| 阳朔县| 从江县| 盈江县| 勐海县| 含山县| 临武县| 蒙城县| 温泉县| 中西区| 大丰市| 成都市| 邛崃市| 河东区| 库尔勒市| 夏津县| 鹤峰县| 荆州市| 大渡口区| 荣成市| 满洲里市| 侯马市| 水富县| 高安市| 稷山县|