1樓:匿名使用者
1. 概述觸發器是一種特殊的儲存過程,它不能被顯式地呼叫,而是在往表中插入記錄﹑更新記錄或者刪除記錄時被自動地啟用。 所以觸發器可以用來實現對錶實施複雜的完整性約束。
2. 觸發器的分類sql server2000提供了兩種觸發器:「instead of」 和「after」 觸發器。
乙個表或檢視的每乙個修改動作(insert、update和delete)都可以有乙個「instead of」 觸發器,乙個表的每個修改動作都可以有多個「after」觸發器。
2.1 「instead of」觸發器「instead of」觸發器在執行真正「插入」之前被執行。除表之外,「instead of」 觸發器也可以用於檢視,用來擴充套件檢視可以支援的更新操作。
「instead of」觸發器會替代所要執行的sql語句,言下之意就是所要執行sql並不會「真正執行」
?123456789alter trigger trigger_學生_deleteon 學生instead of deleteasbegin select 學號, 姓名 from deletedend delete from 學生 where 學號 = 4上例中定義了「trigger學生_delete」觸發器,該觸發器從「delete」表中列印出所要刪除的學生.在執行「delete」操作後,會發現「學號 = 4」的學生並未被刪除, 原因在於「trigger學生delete」替代了所要執行的「delete from 學生 where 學號 = 4」語句,而在「trigger學生_delete」中並未真正刪除學生。
2.2 「after」觸發器「after」觸發器在insert、update或deleted語句執行之後被觸發。「after」觸發器只能用於表。
「after」觸發器主要用於表在修改後(insert、update或delete操作之後),來修改其他表
3. inserted和deleted表sql server為每個觸發器都建立了兩個專用表:inserted表和deleted表。
這兩個表由系統來維護,它們存在於記憶體中而不是在資料庫中,可以理解為乙個虛擬的表。
這兩個表的結構總是與被該觸發器作用的表的結構相同。
觸發器執行完成後,與該觸發器相關的這兩個表也被刪除。
deleted表存放由於執行delete或update語句而要從表中刪除的所有行。
inserted表存放由於執行insert或update語句而要向表中插入的所有行。
對錶的操作inserted邏輯表deleted邏輯表增加記錄(insert)存放增加的記錄無刪除記錄(delete)無存放被刪除的記錄修改記錄(update)存放更新後的記錄存放更新前的記錄4. 觸發器的執行過程如果乙個insert﹑update或者delete語句違反了約束,那麼這條sql語句就沒有執行成功,因此「after」觸發器也不會被啟用。
「instead of」 觸發器可以取代激發它的操作來執行。它在inserted表和deleted表剛剛建立,其它任何操作還沒有發生時被執行。因為「instead of」 觸發器在約束之前執行,所以它可以對約束進行一些預處理。
5. 建立觸發器?1234create trigger trigger_name on as 相應t-sql語句6.
修改觸發器:?1234alter trigger trigger_name on as 相應t-sql語句7. 刪除觸發器:?
1drop trigger trigger_name8. 檢視資料庫中已有觸發器:8.
1 檢視資料庫中所有觸發器?1select * from sysobjects where xtype='tr'8.2 檢視單個觸發器?
1exec sp_helptext '觸發器名'9. 「instead of」相關示例:兩張表:
學生(學號 int, 姓名 varchar)、借書記錄(學號 int, 圖書編號 int)
實現功能:在刪除學生表時,如果該學生仍有借書記錄(未還)則不能刪除
?12345678alter trigger trigger_學生_deleteon 學生instead of deleteasbegin if not exists(select * from 借書記錄, deleted where 借書記錄.學號 = deleted.
學號) delete from 學生 where 學生.學號 in (select 學號 from deleted)end10. 「after」觸發器10.
1 在「訂單」表中建立觸發器,當向「訂單」表中插入一條訂單記錄時,檢查「商品」表的貨品狀態「狀態」是否為1(正在整理),則不能往「訂單」表加入該訂單。?12345678910create trigger trigger_訂單_inserton 訂單after insertas if (select 狀態 from 商品, inserted where 商品.pid = inserted.
pid)=1 begin print 'the goods is being processed' print 'the order cannot be committed' rollback transaction --回滾,避免加入 end該示例中「pid」為商品編碼
該示例的if判斷嚴格來講是不準確的,因為「訂單」表如果每次插入一條記錄,該判斷沒有問題;如果一次插入多條記錄,則「select 狀態」返回的是多行。
10.2 在「訂單」表建立乙個插入觸發器,在新增一條訂單時,減少「商品」表相應的貨品記錄中的庫存。?1234567create trigger trigger_訂單_insert2on 訂單after insertas update 商品 set 數量 = 數量 - inserted.
數量 from 商品, inserted where 商品.pid = inserted.pid10.
3 在「商品」表建立刪除觸發器,實現「商品」表和「訂單」表的級聯刪除。?12345create trigger goodsdelete trigger_商品_deleteon 商品after deleteas delete from 訂單 where 訂單.pid in (select pid from deleted)10.
4 在「訂單」表建立乙個更新觸發器,監視「訂單」表的「訂單日期」列,使其不能被「update」.?123456789create trigger trigger_訂單_updateon 訂單after updateas if update(訂單日期) begin raiserror('訂單日期不能手動修改',10,1) rollback transaction end10.5 在「訂單」表建立乙個插入觸發器,保證向「訂單」表插入的貨品必須要在「商品」表中一定存在。?
123456789create trigger trigger_訂單_insert3on 訂單after insertas if (select count(*) from 商品, inserted where 商品.pid = inserted.pid)=0 begin print '商品不存在' rollback transaction end10.
6 「訂單」表建立乙個插入觸發器,保證向「訂單」表插入的貨品資訊要在「訂單日誌」表中新增?12345alter trigger trigger_訂單_inserton 訂單 for insertas insert into 訂單日誌 select inserted.id, inserted.
pid,inserted.數量 from inserted
如何解決sql server2019本地無法連線的問題
在 開始 選單中,依次指向 所有程式 microsoft sql server 2005 配置工具 然後單擊 sql server 配置管理器 在 sql server 配置管理器中,單擊 sql server 服務 在詳細資訊窗格中,右鍵單擊 sql server 例項 要更改其服務啟動帳戶 的名...
SqlServer2019登入SQL Server登入名
可能是你選擇了強制密碼過期,使用windows認證或sa登陸sql server 2005,在安全中找到guo,並右鍵點屬性,將強制密碼過期取消。用localhost或者 使用者名稱,windows登入 用localhost登入,然後在更改。sql server 2005.預設的伺服器名 登入名 使...
sqlserver2019的金鑰在哪
developer pttfm x467g p7rh2 3q6cg 4dmyb enterprise jd8y6 hqg69 p9h84 xdtpg 34mbb microsoft sql server 2008 r2序列號金鑰 開發版32位 mc46h jqr3c 2jrhy xyrky qwpv...