資料庫原理筆記2020 6 2

2022-08-19 01:01:29 字數 2581 閱讀 8257

觸發器是事件驅動程式

事件的含義 是sql語句,即sql語句的執行看做乙個事件,具體又分為執行前和執行後。

看個例子,假定預先建立了表u,當grade 增加了10%,記錄到表u中

1 create trigger sc_t after update of grade on sc

2 referencing old row as oldtuple new row as newtuple

3 for each row

4 when (newtuple.grade>=1.1*oldtuple.grade)

5 insert into u

6 values(oldtuple.sno, oldtuple.cno, oldtuple.grade, newtuple.grade)

create trigger 建立觸發器的 關鍵字

after update of grade on sc 觸發事件:更新sc的grade列之後

for each row 表示行級觸發,一條sql語句可能影響多行,每影響一行,觸發器執行一次,這叫做 行級觸發器

when (newtuple.grade>=1.1*oldtuple.grade) 表達條件:當grade增加了10%

insert into u

values(oldtuple.sno, oldtuple.cno, oldtuple.grade, newtuple.grade) 把新舊變化記錄到表u裡

old row as oldtuple : 變化前的行,取名 oldtuple 。

new row as newtuple: 變化後的行,取名newtuple。

新例子教授工資不少於4000,假定有一張teacher表裡邊存了所有教師的資訊包括教授,表裡有一列列名是job,job=professor表示是教授,現在看 教授工資不少於4000 的觸發器怎麼寫

1 create trigger insert-or-update-sal

2 before insert or update on teacher

3 for each row

4 begin

5 if (new.job=『professor』) and (new.sal<=4000)

6 then new.sal:=4000;

7 end if;

8 end

當你要改某個人的工資,提交一條update語句,在執行update語句之前會先執行上邊的觸發器程式,執行完觸發器程式以後,再執行update語句

如果寫了一條 update 語句,把教授工資改成 3000,那麼怎麼辦?

一種做法是,在這條語句執行之前 攔截 update語句,也就是說,update語句還沒有執行,由觸發器,把 new 中的工資 改成4000

update語句再執行的時候,工資項的資料就不再是原來語句中的資料,而是被觸發器矯正過的資料,即修改的 工資項 是4000

一種做法是,把before改成after能不能達到相同的效果,理論上可以。因為,教授的工資被改到4000以下,可以在改動完成後進行矯正,但是,上邊的觸發器程式做不到這一點。因為,new.sal:=4000 這一句。無法在update語句執行之後,再起作用。即 無法在update語句執行之後,再修改表。那麼,就引出乙個新問題。如果想用after觸發器完成 教授工資不少於4000,觸發器程式該怎麼寫?tips:只要把then後的語句改成可執行的sql語句即可

將插入操作後增加的學生個數記錄到s_log表中

1 create trigger s_count

2 after insert on student

3 referencing new table as tb

4 for each statement

5 insert into s_log(number)

6 select count(*)

7 from tb

假定預先建立了表s_log,大部分內容跟前邊差不多,create trigger s_count 建立觸發器,事件 after insert on student

for each statement 表示語句級觸發器:整條語句執行完,觸發器再執行一次

referencing new table as tb 表示變化後的行形成的臨時表(new table 關鍵字,表示變化後的行形成的臨時表)

各種檢查,檢查條件達不到不讓語句執行

修正語句執行結果

因為觸發器屬於程式設計範疇類似於高階語言。所以,每家公司都按照自己的想法做了很多東西進去,對使用者來說,幾乎是有一種dbms,就有一種 觸發器語言

換句話說,在一種dbms上寫的觸發器,幾乎不可能原封不動的拿到另一種dbms上執行,這一點正好跟sql相反

一條語句提交給dbms可能會觸發一批觸發器,這樣就有乙個執行次序問題

基本次序:before觸發器->sql ->after觸發器

dbms是  sql直譯器,是 資料管理器,是 安全管理器,是 完整性控制器,是 資料庫程式直譯器

隨著我們繼續學下去這個問題的答案還會增長.當然,所有功能都圍繞著乙個核心,就是 資料管理.

從這個角度,我們可以概括地說,dbms是提供各種資料管理功能的伺服器

005資料庫基礎原理筆記

投影 在乙個二維表當中,根據條件選出需要的列。選擇 在二維表當中,根據條件選擇合適的行。連線 從一張或者多張表當中,選擇需要的列並結合在一起。關鍵字 select from語句可以一行或多行書寫,大小寫不敏感 null值 未定義,不可用的的值。列的別名 重新命名乙個列的標題,緊跟在列名後面,也可以在...

資料庫原理學習筆記

事務被視為不可分割的最小單元,事務的所有操作要麼全部提交成功,要麼全部失敗回滾。回滾可以用回滾日誌 undo log 來實現,回滾日誌記錄著事務所執行的修改操作,在回滾時反向執行這些修改操作即可。資料庫在事務執行前後都保持一致性狀態。在一致性狀態下,所有事務對同乙個資料的讀取結果都是相同的。乙個事務...

資料庫原理

基本內容 acid與cap 資料庫事務可能引發的問題 資料庫鎖的型別 封鎖協議 兩段鎖協議 資料庫隔離級別 mvcc的實現步驟 mysql事務如何實現 資料庫鎖如何實現 xa兩段提交協議。1.acid是資料庫事務正確執行的四個基本要素 原子性 事務是資料庫併發控制的最小單位,要麼全部提交成功,要麼全...