商丘做網(wǎng)站sqlongliqi市場營銷四大基本策略
文章目錄
- 基本概述
- 創(chuàng)建觸發(fā)器
- 更改和刪除觸發(fā)器
- 總結(jié)
基本概述
存儲過程,類似于高階語言的函數(shù)或者方法,包含SQL語句序列,是可復(fù)用的語句,保存在數(shù)據(jù)庫中,在服務(wù)器中執(zhí)行。特點是復(fù)用,提高了效率,安全性。
觸發(fā)器(Trigger)是數(shù)據(jù)庫中一種特殊的存儲過程,它可以在數(shù)據(jù)表上定義特定的事件(如插入、更新或刪除操作)發(fā)生時自動執(zhí)行。觸發(fā)器的主要作用是實現(xiàn)數(shù)據(jù)的完整性約束、審計、日志記錄等功能。在SQL語言中,觸發(fā)器的使用非常廣泛,它可以幫助我們更好地管理和維護數(shù)據(jù)庫。
觸發(fā)器的主要特點如下:
- 觸發(fā)器是一種特殊類型的存儲過程,它與普通的存儲過程不同之處在于,觸發(fā)器不能被直接調(diào)用,而是在滿足特定條件時自動執(zhí)行。
- 觸發(fā)器可以關(guān)聯(lián)到一個或多個數(shù)據(jù)表,當(dāng)這些表的數(shù)據(jù)發(fā)生變化時,觸發(fā)器會自動執(zhí)行。這種關(guān)聯(lián)關(guān)系是通過觸發(fā)器的定義來實現(xiàn)的。
- 觸發(fā)器可以分為多種類型,如DML觸發(fā)器(針對INSERT、UPDATE、DELETE操作)、DDL觸發(fā)器(針對CREATE、ALTER、DROP等操作)和LOGON觸發(fā)器(針對用戶登錄操作)。不同類型的觸發(fā)器可以實現(xiàn)不同的功能。
- 觸發(fā)器可以訪問被修改的數(shù)據(jù)行,這使得我們可以在觸發(fā)器中對數(shù)據(jù)進行更復(fù)雜的處理。例如,我們可以在插入新數(shù)據(jù)時檢查數(shù)據(jù)的有效性,或者在更新數(shù)據(jù)時自動更新與之相關(guān)的其他數(shù)據(jù)表。
- 觸發(fā)器可以級聯(lián)執(zhí)行。當(dāng)一個觸發(fā)器執(zhí)行時,它可以觸發(fā)另一個觸發(fā)器的執(zhí)行。這種級聯(lián)關(guān)系可以幫助我們實現(xiàn)更復(fù)雜的業(yè)務(wù)邏輯。
- 觸發(fā)器可以提高數(shù)據(jù)庫的性能。通過在觸發(fā)器中實現(xiàn)一些復(fù)雜的業(yè)務(wù)邏輯,我們可以減少客戶端程序的負(fù)擔(dān),從而提高整個系統(tǒng)的性能。
- 觸發(fā)器可以提高數(shù)據(jù)的一致性。通過在觸發(fā)器中實現(xiàn)數(shù)據(jù)的完整性約束,我們可以確保數(shù)據(jù)的準(zhǔn)確性和一致性。
- 觸發(fā)器可以實現(xiàn)數(shù)據(jù)庫的審計和日志記錄功能。通過在觸發(fā)器中記錄數(shù)據(jù)的變化情況,我們可以追蹤數(shù)據(jù)庫的操作歷史,從而便于分析和排查問題。
- 觸發(fā)器是一種特殊類型的存儲過程,是通過事件觸發(fā)而執(zhí)行的,而存儲過程可以通過存儲過程名稱而被直接調(diào)用。
觸發(fā)器數(shù)據(jù)庫對象,當(dāng)創(chuàng)建一個觸發(fā)器時必須指定:1> 名稱;2> 在其上定義觸發(fā)器的表;3> 觸發(fā)器將何時激發(fā);4> 指明觸發(fā)器執(zhí)行時應(yīng)做的動作。其名稱必須遵循標(biāo)識符的命名規(guī)則,數(shù)據(jù)庫像存儲普通數(shù)據(jù)那樣存儲觸發(fā)器。觸發(fā)器可以引用當(dāng)前數(shù)據(jù)庫以外的對象,但只能在當(dāng)前數(shù)據(jù)庫中創(chuàng)建觸發(fā)器。盡管不能在臨時表或系統(tǒng)表上創(chuàng)建觸發(fā)器,但是觸發(fā)器可以引用臨時表。
觸發(fā)動作實際上是一系列SQL語句,可以有兩種方式:
(1) 對被事件影響的每一行(FOR EACH ROW),每一元組執(zhí)行觸發(fā)過程,稱為行級觸發(fā)器。
(2) 對整個事件只執(zhí)行一次觸發(fā)過程(FOR EACH STATEMENT),稱為語句級觸發(fā)器。該方式是觸發(fā)器的默認(rèn)方式。
創(chuàng)建觸發(fā)器
觸發(fā)器主要包括兩個方面:指明觸發(fā)器的觸發(fā)事件,指明觸發(fā)器執(zhí)行的動作。
觸發(fā)事件包括表中行的插入、刪除和修改,即執(zhí)行 INSERT、DELETE、UPDATE 語句。 在修改操作 (UPDATE)中,還可以指定特定的屬性或?qū)傩越M的修改為觸發(fā)條件。事件的觸發(fā)還有兩個相關(guān)的時間:BEFORE 和 AFTER。BEFORE 觸發(fā)器是在事件發(fā)生之前觸發(fā),AFTER 觸發(fā)器是在事件發(fā)生之后觸發(fā)。創(chuàng)建觸發(fā)器語句格式如下:
CREATE TRIGGER <觸發(fā)器名> [{BEFORE|AFTER}]
{[DELETE|INSERT|UPDATE OF[列名清單]]}
ON
[REFERENCING <臨時視圖名>]
[FOR EACH ROW|FOR EACH STATEMENT]
[WHEN <觸發(fā)條件>]
BEGIN
<觸發(fā)動作>
END [觸發(fā)器名];
參數(shù)說明:
- BEFORE:指示 DBMS 在執(zhí)行觸發(fā)語句之前激發(fā)觸發(fā)器。
- AFTER:指示 DBMS在執(zhí)行觸發(fā)語句之后激發(fā)觸發(fā)器。
- DELETE:指明是 DELETE 觸發(fā)器,每當(dāng)一個DELETE 語句從表中刪除一行時激發(fā)觸發(fā)器。
- INSERT:指明是 INSERT 觸發(fā)器,每當(dāng)一個INSERT語句向表中插入一行時激發(fā)觸發(fā)器
- UPDATE:指明是 UPDATE 觸發(fā)器,每當(dāng) UPDATE 語句修改由 OF 子句指定的列值時,激發(fā)觸發(fā)器。如果忽略 OF 子句,每當(dāng) UDPATE 語句修改表的任何列值時,DBMS 都將激發(fā)觸發(fā)器。
- REFERENCING <臨時視圖名>:指定臨時視圖的別名 。在觸發(fā)器運行過程中,系統(tǒng)會生成兩個臨時視圖,分別存放被更新值(舊值)和更新后的值(新值)。對于行級觸發(fā)器, 默認(rèn)臨時視圖名分別是 OLD 和 NEW;對于語句級觸發(fā)器,默認(rèn)臨時視圖名分別是 OLD-TABLE 和 NEW-TABLE。一旦觸發(fā)器運行結(jié)束,臨時視圖就不在。
- WHEN <觸發(fā)條件>:指定觸發(fā)器的觸發(fā)條件。當(dāng)滿足觸發(fā)條件時,DBMS 才激發(fā)觸發(fā)器。觸發(fā)條件中必須包含臨時視圖名,不包含查詢。
示例1. 銀行數(shù)據(jù)庫關(guān)系模式如下:
Account (Account-no, branch-name, balance)Loan (Loan-no, branch-name, amount)Depositor (customer-name, Account-no)
賬戶關(guān)系模式 Account 中的屬性 Account-no 表示賬號 ,branch-name 表示支行名稱,balance 表示余額。貸款關(guān)系模式 Loan 中的屬性 Loan-no 表示貸款號,branch-name 表示支行名稱,amount 表示金額。存款關(guān)系模式 Depositor 中的屬性 customer-name 表示存款人姓名。SQL-99 創(chuàng)建觸發(fā)器如下所示:
CREATE TRIGGER overdraft_trigger AFTER UPDATE ON Account
REFERENCING NEW ROW AS nrow
FOR EACH ROW
WHEN nrow.balance < 0
BEGIN ATOMIC
INSERT INTO borrower
(SELECT customer-name,Account-no
FROM Depositor
WHERE nrow.account-no = Depositor.account-no);
INSERT INTO loan VALUES (nrow.account-no,branch-name,-nrow.balance);
UPDATE account SET balance = 0
WHERE account.account-no = nrow.account-no;
END;
When語句指定一個條件nrow.balance<0。僅對滿足條件的元組才會執(zhí)行余下的觸發(fā)器;BEGIN ATOMIC 子句用來將多行SQL語句集成為一個復(fù)合語句,該子句中的兩條 INSERT INTO 語句執(zhí)行了在borrower和loan關(guān)系中建立新的貸款業(yè)務(wù);UPDATE語句用來將賬戶余額清零;
示例2. 倉庫管理數(shù)據(jù)庫中有如下關(guān)系,請創(chuàng)建一個重新訂購商品的觸發(fā)器。
inventory(item,level) :表示某種商品在倉庫中的現(xiàn)有量minlevel(item,level) :表示某種商品在倉庫中存有的最小量reorder(item,amount) :表示某種商品小于最小量的時候要訂購的數(shù)量orders(item,amount):表示某種商品被定購的量
CREATE TRIGGER reorder_trigger AFTER UPDATE OF amount on inventory
REFERENCING OLD ROW AS orow,NEW ROW AS nrow
FOR EACH ROW
WHEN nrow.level <= (SELECT levelFROM minlevelWHERE minlevel.item = orow.item)
AND orow.level > (SELECT levelFROM minlevelWHERE minlevel.item = orow.item)
BEGIN
INSERT INTO orders
(SELECT item,amount
FROM reorder
WHERE reorder.item = orow.item)
END;
示例3. 若修改某商品的庫存時,使得庫存值小于或等于其最小庫存值,則向采購表插入一條記錄,要求采購的數(shù)量是該商品最小庫存值的兩倍再加上10。
CREATE TRIGGER 采購-trigger AFTER UPDATE ON 商品 [AFTER UPDATE OF 庫存 ON 商品]
REFERENCING NEW ROW AS nrow
FOR EACH ROW
WHEN nrow.庫存<=nrow.最小庫存
BEGIN
INSERT INTO 采購(商品號,采購數(shù)量)
VALUES(nrow.商品號,nrow.最小庫存*2+10)
END;
更改和刪除觸發(fā)器
使用系統(tǒng)命令 ALTER TRIGGER 更改指定的觸發(fā)器的定義,語法如下:
ALTER TRIGGER <觸發(fā)器> [{BEFORE|AFTER}] {[DELETE|INSERT|UPDATE OF [列名清單]]}
ON 表名|視圖名
AS
BEGIN SQL STATEMENTS
END;
使用 DROP TRIGGER <觸發(fā)器>[,…n]
,其中,n 表示可以指定多個觸發(fā)器的占位符。
總結(jié)
觸發(fā)器是數(shù)據(jù)庫中一種非常重要的功能,它可以幫助我們實現(xiàn)數(shù)據(jù)的完整性約束、審計、日志記錄等功能。通過合理地使用觸發(fā)器,我們可以提高數(shù)據(jù)庫的性能和數(shù)據(jù)的一致性,從而更好地管理和維護數(shù)據(jù)庫。然而,觸發(fā)器的使用也需要謹(jǐn)慎,因為不當(dāng)?shù)氖褂每赡軙?dǎo)致性能問題和數(shù)據(jù)不一致的問題。因此,在使用觸發(fā)器時,我們需要充分了解其原理和使用方法,以確保其能夠發(fā)揮最大的作用。