新聞中心
在數(shù)據(jù)庫中,觸發(fā)器(Trigger)是由一些預定義的SQL語句組成的程序,它們可以在特定的條件下自動地執(zhí)行某些SQL語句。通過使用觸發(fā)器,我們可以對數(shù)據(jù)庫的一些操作進行自動化控制,從而提高數(shù)據(jù)庫的利用效率。在本文中,我們將介紹如何查詢SQL數(shù)據(jù)庫中的觸發(fā)器。

SQL Server中的觸發(fā)器
在SQL Server數(shù)據(jù)庫中,觸發(fā)器是存儲在獨立對象中的特殊存儲過程。我們可以使用以下命令查詢當前數(shù)據(jù)庫中的觸發(fā)器:
“`sql
SELECT
name,
crdate,
crmodate
FROM
sysobjects
WHERE
xtype = ‘TR’
“`
其中,`xtype = ‘TR’`表示查詢數(shù)據(jù)庫中類型為觸發(fā)器(TR)的對象。
以上命令將返回當前數(shù)據(jù)庫中所有觸發(fā)器的名稱、創(chuàng)建日期和修改日期。
我們也可以通過以下命令查詢指定表中的觸發(fā)器:
“`sql
SELECT
name,
crdate,
crmodate
FROM
sysobjects
WHERE
xtype = ‘TR’ AND
parent_obj = OBJECT_ID(‘tablename’)
“`
其中,`parent_obj = OBJECT_ID(‘tablename’)`表示查詢某個表中的觸發(fā)器。
以上命令將返回指定表中所有觸發(fā)器的名稱、創(chuàng)建日期和修改日期。
MySQL中的觸發(fā)器
在MySQL數(shù)據(jù)庫中,我們可以通過以下命令查詢當前數(shù)據(jù)庫中的觸發(fā)器:
“`sql
SHOW TRIGGERS FROM databasename;
“`
其中,`databasename`表示數(shù)據(jù)庫名稱。
以上命令將返回當前數(shù)據(jù)庫中所有觸發(fā)器的名稱、觸發(fā)事件、觸發(fā)時機、執(zhí)行語句和創(chuàng)建者。
我們也可以通過以下命令查詢指定表中的觸發(fā)器:
“`sql
SHOW TRIGGERS FROM databasename WHERE `Table` = ‘tablename’;
“`
其中,`tablename`表示需要查詢的表名稱。
以上命令將返回指定表中所有觸發(fā)器的名稱、觸發(fā)事件、觸發(fā)時機、執(zhí)行語句和創(chuàng)建者。
通過以上命令,我們可以查詢到當前數(shù)據(jù)庫或指定表中的所有觸發(fā)器,并獲取它們的相關(guān)信息。對于不同的數(shù)據(jù)庫,查詢語句可能會有所不同,但基本原理是相同的。我們可以根據(jù)實際情況,選用不同的方法查詢數(shù)據(jù)庫中的觸發(fā)器,以便更好地管理和控制數(shù)據(jù)。
成都網(wǎng)站建設公司-創(chuàng)新互聯(lián),建站經(jīng)驗豐富以策略為先導10多年以來專注數(shù)字化網(wǎng)站建設,提供企業(yè)網(wǎng)站建設,高端網(wǎng)站設計,響應式網(wǎng)站制作,設計師量身打造品牌風格,熱線:028-86922220SQL中,觸發(fā)器是什么?
觸發(fā)器(trigger)是個特殊的存儲過程,它的執(zhí)行不是由程序調(diào)用,也不是手工啟動,而是由事件來觸發(fā),比如當對一個表進行操作( insert,delete, update)時就會激活它執(zhí)行。觸發(fā)器經(jīng)常用于加強數(shù)據(jù)的完整性約束和業(yè)務規(guī)則等。 觸發(fā)器可以從 DBA_TRIGGERS ,USER_TRIGGERS 數(shù)據(jù)字典中查到。
觸發(fā)悶侍櫻器可以查詢其他表,而且可以包含復雜的 SQL語句。它們主要用于強制服從復雜的業(yè)務規(guī)則或要求。例如:您可以根據(jù)客戶當前的帳戶狀態(tài),控制是否允許插入新訂單。
觸發(fā)器分為DML觸發(fā)器、DDL觸發(fā)器
DML觸發(fā)器:當數(shù)據(jù)庫中表中的數(shù)據(jù)發(fā)生變化時,包括insert,update,delete任意操作,如果我們對該表寫了對應的DML觸發(fā)器,那么該觸發(fā)器自動執(zhí)行。DML觸發(fā)器的主要作用在螞叢于強制執(zhí)行業(yè) 務規(guī)則,以及擴展Sql Server約束,默認值等。因為我們知道約束只能約束同一個表中的數(shù)據(jù),而觸發(fā)談滑器中則可以執(zhí)行任意Sql命令。
DDL觸發(fā)器:它是Sql Server2023新增的觸發(fā)器,主要用于審核與規(guī)范對數(shù)據(jù)庫中表,觸發(fā)器,視圖等結(jié)構(gòu)上的操作。比如在修改表,修改列,新增表,新增列等。它在數(shù)據(jù)庫結(jié)構(gòu)發(fā)生變化時執(zhí)行,我們主要用它來記錄數(shù)據(jù)庫的修改過程,以及限制程序員對數(shù)據(jù)庫的修改,比如不允許刪除某些指定表等。
希望你看完我的解釋你能對觸發(fā)器有一定了解。
1、觸發(fā)器。 定義: 何為觸發(fā)器?在SQL Server里面也就是對某一個表的一定的操作,觸發(fā)某種條件,從而執(zhí)行的一段程序。觸發(fā)器是一個特殊的存儲過程。 常見的觸發(fā)器有三種:分別應用于Insert , Update , Delete 事件。(SQL Server 2023定義了新的觸發(fā)器,這里不提) 我為什么要使用觸發(fā)器?比如,這么兩個表: Create Table Student(-學生表StudentID int primary key,學號…. ) Create Table BorrowRecord(–學生借書記錄表BorrowRecord int identity(1,1),流水號StudentID int ,學號BorrowDate datetime, –借出時間ReturnDAte Datetime, –歸還時間… ) 用到的功能有:.如果我更改了學生的學號,我希望他的借書記錄仍然與這個學生相關(guān)(也就是同時更改借書記錄表的學號);.如果該學生已經(jīng)畢業(yè),我希望刪除他的學號的同時,也刪除它的借書記錄。 等等。 這時候可以用到觸發(fā)器。對于1,創(chuàng)建一個Update觸發(fā)器: Create Trigger truStudent On Student for UpdateName:truStudent –func:更新BorrowRecord 的StudentID,行和與Student同步。 –Use :None –User:System –Author: 懶蟲 # SapphireStudio (
www.chair3.com
) –Date : –Memo : 臨時寫寫的,給大家作個Sample。沒有調(diào)試阿。As if Update(StudentID) beginUpdate BorrowRecordSet br.StudentID=i.StudentIDFrom BorrowRecord br , Deleted d ,Inserted iWhere br.StudentID=d.StudentID end理解觸發(fā)器里面的兩個臨時的表渣數(shù):Deleted , Inserted 。注意Deleted 與Inserted分別表檔梁盯示觸發(fā)事件的表“舊的一條記錄”和“新的一條記錄”。 一個Update 的過程可以看作為:生成新的記錄到Inserted表,復制舊的記錄到Deleted表,然后刪除Student記錄并寫入新紀錄。 對于2,創(chuàng)建一個Delete觸發(fā)器 Create trigger trdStudent On Student for DeleteName:trdStudent –func:同時刪除 BorrowRecord 的數(shù)據(jù) –Use :None –User:System –Author: 懶蟲 # SapphireStudio (
www.chair3.com
) –Date : –Memo : 臨時寫寫的,給大家作個Sample。沒有調(diào)試阿。As Delete BorrowRecordFrom BorrowRecord br , Delted dWhere br.StudentID=d.StudentID 從這兩個例子我們可以看到了觸發(fā)器的關(guān)鍵:A.2個臨時的表;B.觸發(fā)機制。 這里我們只講解最簡單的觸發(fā)器。復雜的容后說明。 事實上,我不鼓勵使用觸發(fā)器。觸發(fā)器的初始設計思想,已經(jīng)被“級聯(lián)”所替代。
CREATE TRIGGER
創(chuàng)建觸發(fā)器,觸發(fā)器是一種特殊的存儲過程,在用戶試圖對指定的表執(zhí)行指定的數(shù)據(jù)修改語句時自動執(zhí)行。Microsoft? SQL Server? 允許為任何給定的 INSERT、UPDATE 或 DELETE 語句創(chuàng)建多個觸發(fā)器。
語法
CREATE TRIGGER trigger_name
ON { table | view }
{
{ { FOR | AFTER | INSTEAD OF } { }
AS
| IF ( COLUMNS_UPDATED ( ) { bitwise_operator } updated_bitmask )
{ comparison_operator } column_bitmask
} >
sql_statement
}
}
參數(shù)
trigger_name
是觸發(fā)器的名稱。觸發(fā)器名稱必須符合標識符規(guī)則,并且在數(shù)據(jù)庫中必須唯一??梢赃x擇是否指定觸發(fā)器所有者名稱。
Table | view
是在其上執(zhí)行觸發(fā)器的表或視圖,有時稱為觸發(fā)器表或觸發(fā)器視圖。可以選擇是否指定表或視圖的所有者名稱。
WITH ENCRYPTION
加密 syscomments 表中包含 CREATE TRIGGER 語句文本的條目。使用 WITH ENCRYPTION 可防止將觸發(fā)器作為 SQL Server 復制的一部分發(fā)布。
AFTER
指定觸發(fā)器只有在觸發(fā) SQL 語句中指定的所有操作都已成功執(zhí)行后才激發(fā)。所有的引用級聯(lián)操作和約束檢查也必須成功完成后,才能執(zhí)行此觸發(fā)器。
如果僅指定 FOR 關(guān)鍵字,則 AFTER 是默認設置。
不能在視圖上定義 AFTER 觸發(fā)器。
INSTEAD OF
指定執(zhí)行觸發(fā)器而不是執(zhí)行觸發(fā) SQL 語句,從而替代觸發(fā)語句的操州迅兄作。
在表或視圖上,每個 INSERT、UPDATE 或 DELETE 語句最多可以定義一個 INSTEAD OF 觸發(fā)器。然而,可以在每個具有 INSTEAD OF 觸發(fā)器的視圖上定義視圖。
INSTEAD OF 觸發(fā)器不能在 WITH CHECK OPTION 的可更新視圖上定義。如果向指定了 WITH CHECK OPTION 選項的可更新視圖添加 INSTEAD OF 觸發(fā)器,SQL Server 將產(chǎn)生一個錯誤。用戶必須用 ALTER VIEW 刪除該選項后才能定義 INSTEAD OF 觸發(fā)器。
{ }
是指定在表或視圖上執(zhí)行哪些數(shù)據(jù)修改語句時將激活觸發(fā)器的關(guān)鍵字。必須至少指定一個選項。在觸發(fā)器定義中允許使用以任意順序組合的這些關(guān)鍵字。如果指定的選項多于一個,需用逗號分隔這些選項。
對于 INSTEAD OF 觸發(fā)器,不允許在具有 ON DELETE 級聯(lián)操作引用關(guān)系的表上使用 DELETE 選項。同樣,也不允許在具有 ON UPDATE 級聯(lián)操作引用關(guān)系的表上使用 UPDATE 選項。
WITH APPEND
指定應該添加現(xiàn)有類型的其它觸發(fā)器。只有當兼容級別是 65 或更昌鉛低時,才需要使用該可選子句。如果兼容級別是 70 或更高,則不必使用 WITH APPEND 子句添加現(xiàn)有類型的其它觸發(fā)器(這是兼容級別設置為 70 或更高的 CREATE TRIGGER 的默認行為)。有關(guān)更多信息,請參見 sp_dbcmptlevel。
WITH APPEND 不能與 INSTEAD OF 觸發(fā)器一起使用,或者,如果顯式聲明 AFTER 觸發(fā)器,也不能使用該子句。只有當出于向后兼容而指定 FOR 時(沒有 INSTEAD OF 或 AFTER),才能使用 WITH APPEND。冊襲以后的版本將不支持 WITH APPEND 和 FOR(將被解釋為 AFTER)。
NOT FOR REPLICATION
表示當復制進程更改觸發(fā)器所涉及的表時,不應執(zhí)行該觸發(fā)器。
AS
是觸發(fā)器要執(zhí)行的操作。
sql_statement
是觸發(fā)器的條件和操作。觸發(fā)器條件指定其它準則,以確定 DELETE、INSERT 或 UPDATE 語句是否導致執(zhí)行觸發(fā)器操作。
當嘗試 DELETE、INSERT 或 UPDATE 操作時,Transact-SQL語句中指定的觸發(fā)器操作將生效。
觸發(fā)器可以包含任意數(shù)量和種類的 Transact-SQL 語句。觸發(fā)器旨在根據(jù)數(shù)據(jù)修改語句檢查或更改數(shù)據(jù);它不應將數(shù)據(jù)返回給用戶。觸發(fā)器中的 Transact-SQL 語句常常包含控制流語言。CREATE TRIGGER 語句中使用幾個特殊的表:
deleted 和 inserted 是邏輯(概念)表。這些表在結(jié)構(gòu)上類似于定義觸發(fā)器的表(也就是在其中嘗試用戶操作的表);這些表用于保存用戶操作可能更改的行的舊值或新值。例如,若要檢索 deleted 表中的所有值,請使用:
SELECT *
FROM deleted
如果兼容級別等于 70,那么在 DELETE、INSERT 或 UPDATE 觸發(fā)器中,SQL Server 將不允許引用 inserted 和 deleted 表中的 text、ntext 或 image 列。不能訪問 inserted 和 deleted 表中的 text、ntext 和 image 值。若要在 INSERT 或 UPDATE 觸發(fā)器中檢索新值,請將 inserted 表與原始更新表聯(lián)接。當兼容級別是 65 或更低時,對 inserted 或 deleted 表中允許空值的text、ntext 或 image 列,將返回空值;如果這些列不可為空,則返回零長度字符串。
當兼容級別是 80 或更高時,SQL Server 允許在表或視圖上通過 INSTEAD OF 觸發(fā)器更新 text、ntext 或 image 列。
n
是表示觸發(fā)器中可以包含多條 Transact-SQL 語句的占位符。對于 IF UPDATE (column) 語句,可以通過重復 UPDATE (column) 子句包含多列。
IF UPDATE (column)
測試在指定的列上進行的 INSERT 或 UPDATE 操作,不能用于 DELETE 操作。可以指定多列。因為在 ON 子句中指定了表名,所以在 IF UPDATE 子句中的列名前不要包含表名。若要測試在多個列上進行的 INSERT 或 UPDATE 操作,請在之一個操作后指定單獨的 UPDATE(column) 子句。在 INSERT 操作中 IF UPDATE 將返回 TRUE 值,因為這些列插入了顯式值或隱性 (NULL) 值。
說明 IF UPDATE (column) 子句的功能等同于 IF、IF…ELSE 或 WHILE 語句,并且可以使用 BEGIN…END 語句塊。有關(guān)更多信息,請參見控制流語言。
可以在觸發(fā)器主體中的任意位置使用 UPDATE (column)。
column
是要測試 INSERT 或 UPDATE 操作的列名。該列可以是 SQL Server 支持的任何數(shù)據(jù)類型。但是,計算列不能用于該環(huán)境中。有關(guān)更多信息,請參見數(shù)據(jù)類型。
IF (COLUMNS_UPDATED())
測試是否插入或更新了提及的列,僅用于 INSERT 或 UPDATE 觸發(fā)器中。COLUMNS_UPDATED 返回 varbinary 位模式,表示插入或更新了表中的哪些列。
COLUMNS_UPDATED 函數(shù)以從左到右的順序返回位,最左邊的為最不重要的位。最左邊的位表示表中的之一列;向右的下一位表示第二列,依此類推。如果在表上創(chuàng)建的觸發(fā)器包含 8 列以上,則 COLUMNS_UPDATED 返回多個字節(jié),最左邊的為最不重要的字節(jié)。在 INSERT 操作中 COLUMNS_UPDATED 將對所有列返回 TRUE 值,因為這些列插入了顯式值或隱性 (NULL) 值。
可以在觸發(fā)器主體中的任意位置使用 COLUMNS_UPDATED。
bitwise_operator
是用于比較運算的位運算符。
updated_bitmask
是整型位掩碼,表示實際更新或插入的列。例如,表 t1 包含列 C1、C2、C3、C4 和 C5。假定表 t1 上有 UPDATE 觸發(fā)器,若要檢查列 C2、C3 和 C4 是否都有更新,指定值 14;若要檢查是否只有列 C2 有更新,指定值 2。
comparison_operator
是比較運算符。使用等號 (=) 檢查 updated_bitmask 中指定的所有列是否都實際進行了更新。使用大于號 (>) 檢查 updated_bitmask 中指定的任一列或某些列是否已更新。
column_bitmask
是要檢查的列的整型位掩碼,用來檢查是否已更新或插入了這些列。
注釋
觸發(fā)器常常用于強制業(yè)務規(guī)則和數(shù)據(jù)完整性。SQL Server 通過表創(chuàng)建語句(ALTER TABLE 和 CREATE TABLE)提供聲明引用完整性 (DRI);但是 DRI 不提供數(shù)據(jù)庫間的引用完整性。若要強制引用完整性(有關(guān)表的主鍵和外鍵之間關(guān)系的規(guī)則),請使用主鍵和外鍵約束(ALTER TABLE 和 CREATE TABLE 的 PRIMARY KEY 和 FOREIGN KEY 關(guān)鍵字)。如果觸發(fā)器表存在約束,則在 INSTEAD OF 觸發(fā)器執(zhí)行之后和 AFTER 觸發(fā)器執(zhí)行之前檢查這些約束。如果違反了約束,則回滾 INSTEAD OF 觸發(fā)器操作且不執(zhí)行(激發(fā))AFTER 觸發(fā)器。
可用 sp_settriggerorder 指定表上之一個和最后一個執(zhí)行的 AFTER 觸發(fā)器。在表上只能為每個 INSERT、UPDATE 和 DELETE 操作指定一個之一個執(zhí)行和一個最后一個執(zhí)行的 AFTER 觸發(fā)器。如果同一表上還有其它 AFTER 觸發(fā)器,則這些觸發(fā)器將以隨機順序執(zhí)行。
如果 ALTER TRIGGER 語句更改了之一個或最后一個觸發(fā)器,則將除去已修改觸發(fā)器上設置的之一個或最后一個特性,而且必須用 sp_settriggerorder 重置排序值。
只有當觸發(fā) SQL 語句(包括所有與更新或刪除的對象關(guān)聯(lián)的引用級聯(lián)操作和約束檢查)成功執(zhí)行后,AFTER 觸發(fā)器才會執(zhí)行。AFTER 觸發(fā)器檢查觸發(fā)語句的運行效果,以及所有由觸發(fā)語句引起的 UPDATE 和 DELETE 引用級聯(lián)操作的效果。
觸發(fā)器是對表進行插入、更新、刪除的時候會自動執(zhí)行的特殊存儲過程。手戚
觸發(fā)器一般用在check約束更加復雜的約束上面。例如在執(zhí)行update、insert、delete這些操作的時候,系統(tǒng)會自動調(diào)用執(zhí)行該表上對應的觸發(fā)器。
SQL Server 2023中觸發(fā)器可以分為兩類:DML觸發(fā)器和DDL觸發(fā)器,其中DDL觸發(fā)器它們會影響多種數(shù)據(jù)定義語言語句而激發(fā),這些語句有create、alter、drop語句。
DML觸發(fā)器分為:
1、 after觸發(fā)器(之后觸發(fā))
a、 insert觸發(fā)器
b、 update觸發(fā)器
c、 delete觸發(fā)器
2、 instead of 觸發(fā)器 (之前觸發(fā))
其中after觸發(fā)器要求只有執(zhí)行某一操作insert、update、delete之后觸發(fā)器才被觸發(fā),且只能定義在表上。而instead of觸發(fā)器表示并不執(zhí)行其定義的操作(insert、update、delete)而僅是執(zhí)行觸發(fā)器本身。既可以在表上定義instead of觸發(fā)器,也可以在視圖上定義。
觸發(fā)器有兩個特殊的表:插入表(instered表)和刪除表(deleted表)。這兩張是邏輯表也是虛表。有系統(tǒng)在內(nèi)存中創(chuàng)建者兩張表,不會存儲在數(shù)據(jù)庫中。而且兩張表的都是只讀的,只能讀取鬧斗數(shù)據(jù)而不能修改數(shù)據(jù)。這兩張表的結(jié)果總是與被改觸發(fā)器應用的表的結(jié)構(gòu)相同。當觸發(fā)器完成工作后,這兩張表就會被刪除。Inserted表的數(shù)據(jù)是插入或是修改后的數(shù)據(jù),而deleted表的數(shù)據(jù)是更新前的或是刪除的數(shù)據(jù)。
Update數(shù)據(jù)的時候就是先刪除表記錄,然后增加一條記錄。這樣在inserted和deleted表就都有update后的數(shù)據(jù)記錄了。注意的是:觸發(fā)器本身就是一個事務,所以在觸發(fā)器畢彎陵里面可以對修改數(shù)據(jù)進行一些特殊的檢查。如果不滿足可以利用事務回滾,撤銷操作。
觸發(fā)器是對表進行插入、更新、刪除的時候會自動執(zhí)行的特殊存儲過程。手戚
觸發(fā)器一般用在check約束更加復雜的約束上面。例如在執(zhí)行update、insert、delete這些操作的時候,系統(tǒng)會自動調(diào)用執(zhí)行該表上對應的觸發(fā)器。
SQL Server 2023中觸發(fā)器可以分為兩類:DML觸發(fā)器和DDL觸發(fā)器,其中DDL觸發(fā)器它們會影響多種數(shù)據(jù)定義語言語句而激發(fā),這些語句有create、alter、drop語句。
DML觸發(fā)器分為:
1、 after觸發(fā)器(之后觸發(fā))
a、 insert觸發(fā)器
b、 update觸發(fā)器
c、 delete觸發(fā)器
2、 instead of 觸發(fā)器 (之前觸發(fā))
其中after觸發(fā)器要求只有執(zhí)行某一操作insert、update、delete之后觸發(fā)器才被觸發(fā),且只能定義在表上。而instead of觸發(fā)器表示并不執(zhí)行其定義的操作(insert、update、delete)而僅是執(zhí)行觸發(fā)器本身。既可以在表上定義instead of觸發(fā)器,也可以在視圖上定義。
觸發(fā)器有兩個特殊的表:插入表(instered表)和刪除表(deleted表)。這兩張是邏輯表也是虛表。有系統(tǒng)在內(nèi)存中創(chuàng)建者兩張表,不會存儲在數(shù)據(jù)庫中。而且兩張表的都是只讀的,只能讀取鬧斗數(shù)據(jù)而不能修改數(shù)據(jù)。這兩張表的結(jié)果總是與被改觸發(fā)器應用的表的結(jié)構(gòu)相同。當觸發(fā)器完成工作后,這兩張表就會被刪除。Inserted表的數(shù)據(jù)是插入或是修改后的數(shù)據(jù),而deleted表的數(shù)據(jù)是更新前的或是刪除的數(shù)據(jù)。
關(guān)于查詢sql 數(shù)據(jù)庫中的觸發(fā)器的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
創(chuàng)新互聯(lián)【028-86922220】值得信賴的成都網(wǎng)站建設公司。多年持續(xù)為眾多企業(yè)提供成都網(wǎng)站建設,成都品牌建站設計,成都高端網(wǎng)站制作開發(fā),SEO優(yōu)化排名推廣服務,全網(wǎng)營銷讓企業(yè)網(wǎng)站產(chǎn)生價值。
網(wǎng)站名稱:如何查詢SQL數(shù)據(jù)庫中的觸發(fā)器?(查詢sql數(shù)據(jù)庫中的觸發(fā)器)
網(wǎng)址分享:http://m.fisionsoft.com.cn/article/dpchioe.html


咨詢
建站咨詢
