




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、SQL觸發(fā)器語法參考CreateTRIGGERtrigger_nameONtable|viewWITHENCRYPTIONFOR|AFTER|INSTEADOFInsert,UpdateWITHAPPENDNOTFORREPLICATIONASIFUpdate(column)AND|orUpdate(column).n|IF(COLUMNS_UpdateD()bitwise_operatorupdated_bitmask)comparison_operatorcolumn_bitmask.nsql_statement.n參數(shù)trigger_name是觸發(fā)器的名稱。觸發(fā)器名稱必須符合標(biāo)識(shí)符規(guī)則,
2、并且在數(shù)據(jù)庫(kù)中必須唯一??梢赃x擇是否指定觸發(fā)器所有者名稱。Table|view是在其上執(zhí)行觸發(fā)器的表或視圖,有時(shí)稱為觸發(fā)器表或觸發(fā)器視圖??梢赃x擇是否指定表或視圖的所有者名稱。WITHENCRYPTION加密syscomments表中包含CreateTRIGGER語句文本的條目。使用WITHENCRYPTION可防止將觸發(fā)器作為SQLServer復(fù)制的一部分發(fā)布。AFTER指定觸發(fā)器只有在觸發(fā)SQL語句中指定的所有操作都已成功執(zhí)行后才激發(fā)。所有的引用級(jí)聯(lián)操作和約束檢查也必須成功完成后,才能執(zhí)行此觸發(fā)器。如果僅指定FOR關(guān)鍵字,則AFTER是默認(rèn)設(shè)置。不能在視圖上定義AFTER觸發(fā)器。INSTE
3、ADOF指定執(zhí)行觸發(fā)器而不是執(zhí)行觸發(fā)SQL語句,從而替代觸發(fā)語句的操作。在表或視圖上,每個(gè)Insert、Update或Delete語句最多可以定義一個(gè)INSTEADOF觸發(fā)器。然而,可以在每個(gè)具有INSTEADOF觸發(fā)器的視圖上定義視圖。INSTEADOF觸發(fā)器不能在WITHCHECKOPTION的可更新視圖上定義。如果向指定了WITHCHECKOPTION選項(xiàng)的可更新視圖添加INSTEADOF觸發(fā)器,SQLServer將產(chǎn)生一個(gè)錯(cuò)誤。用戶必須用AlterVIEW刪除該選項(xiàng)后才能定義INSTEADOF觸發(fā)器。Delete,Insert,Update是指定在表或視圖上執(zhí)行哪些數(shù)據(jù)修改語句時(shí)將激活
4、觸發(fā)器的關(guān)鍵字。必須至少指定一個(gè)選項(xiàng)。在觸發(fā)器定義中允許使用以任意順序組合的這些關(guān)鍵字。如果指定的選項(xiàng)多于一個(gè),需用逗號(hào)分隔這些選項(xiàng)。對(duì)于INSTEADOF觸發(fā)器,不允許在具有ONDelete級(jí)聯(lián)操作引用關(guān)系的表上使用Delete選項(xiàng)。同樣,也不允許在具有ONUpdate級(jí)聯(lián)操作引用關(guān)系的表上使用Update選項(xiàng)。WITHAPPEND指定應(yīng)該添加現(xiàn)有類型的其它觸發(fā)器。只有當(dāng)兼容級(jí)別是65或更低時(shí),才需要使用該可選子句。如果兼容級(jí)別是70或更高,則不必使用WITHAPPEND子句添加現(xiàn)有類型的其它觸發(fā)器(這是兼容級(jí)別設(shè)置為70或更高的CreateTRIGGER的默認(rèn)行為)。有關(guān)更多信息,請(qǐng)參見s
5、p_dbcmptlevel。WITHAPPEND不能與INSTEADOF觸發(fā)器一起使用,或者,如果顯式聲明AFTER觸發(fā)器,也不能使用該子句。只有當(dāng)出于向后兼容而指定FOR時(shí)(沒有INSTEADOF或AFTER),才能使用WITHAPPEND。以后的版本將不支持WITHAPPEND和FOR(將被解釋為AFTER)。NOTFORREPLICATION表示當(dāng)復(fù)制進(jìn)程更改觸發(fā)器所涉及的表時(shí),不應(yīng)執(zhí)行該觸發(fā)器。AS是觸發(fā)器要執(zhí)行的操作。sql_statement是觸發(fā)器的條件和操作。觸發(fā)器條件指定其它準(zhǔn)則,以確定Delete、Insert或Update語句是否導(dǎo)致執(zhí)行觸發(fā)器操作。當(dāng)嘗試Delete、I
6、nsert或Update操作時(shí),Transact-SQL語句中指定的觸發(fā)器操作將生效。觸發(fā)器可以包含任意數(shù)量和種類的Transact-SQL語句。觸發(fā)器旨在根據(jù)數(shù)據(jù)修改語句檢查或更改數(shù)據(jù);它不應(yīng)將數(shù)據(jù)返回給用戶。觸發(fā)器中的Transact-SQL語句常常包含控制流語言。CreateTRIGGER語句中使用幾個(gè)特殊的表:deleted和inserted是邏輯(概念)表。這些表在結(jié)構(gòu)上類似于定義觸發(fā)器的表(也就是在其中嘗試用戶操作的表);這些表用于保存用戶操作可能更改的行的舊值或新值。例如,若要檢索deleted表中的所有值,請(qǐng)使用:Select*FROMdeleted如果兼容級(jí)別等于70,那么在
7、Delete、Insert或Update觸發(fā)器中,SQLServer將不允許引用inserted和deleted表中的text、ntext或image列。不能訪問inserted和deleted表中的text、ntext和image值。若要在Insert或Update觸發(fā)器中檢索新值,請(qǐng)將inserted表與原始更新表聯(lián)接。當(dāng)兼容級(jí)別是65或更低時(shí),對(duì)inserted或deleted表中允許空值的text、ntext或image列,將返回空值;如果這些列不可為空,則返回零長(zhǎng)度字符串。當(dāng)兼容級(jí)別是80或更高時(shí),SQLServer允許在表或視圖上通過INSTEADOF觸發(fā)器更新text、ntext
8、或image列。是表示觸發(fā)器中可以包含多條Transact-SQL語句的占位符。對(duì)于IFUpdate(column)語句,可以通過重復(fù)Update(column)子句包含多列。IFUpdate(column)測(cè)試在指定的列上進(jìn)行的Insert或Update操作,不能用于Delete操作。可以指定多列。因?yàn)樵贠N子句中指定了表名,所以在IFUpdate子句中的列名前不要包含表名。若要測(cè)試在多個(gè)列上進(jìn)行的Insert或Update操作,請(qǐng)?jiān)诘谝粋€(gè)操作后指定單獨(dú)的Update(column)子句。在Insert操作中IFUpdate將返回TRUE值,因?yàn)檫@些列插入了顯式值或隱性(NULL)值。說明I
9、FUpdate(column)子句的功能等同于IF、IF.ELSE或WHILE語句,并且可以使用BEGIN.END語句塊。有關(guān)更多信息,請(qǐng)參見控制流語言??梢栽谟|發(fā)器主體中的任意位置使用Update(column)。column是要測(cè)試Insert或Update操作的列名。該列可以是SQLServer支持的任何數(shù)據(jù)類型。但是,計(jì)算列不能用于該環(huán)境中。有關(guān)更多信息,請(qǐng)參見數(shù)據(jù)類型。IF(COLUMNS_UpdateD()測(cè)試是否插入或更新了提及的列,僅用于Insert或Update觸發(fā)器中。COLUMNS_UpdateD返回varbinary位模式,表示插入或更新了表中的哪些列。COLUMNS_
10、UpdateD函數(shù)以從左到右的順序返回位,最左邊的為最不重要的位。最左邊的位表示表中的第一列;向右的下一位表示第二列,依此類推。如果在表上創(chuàng)建的觸發(fā)器包含8列以上,則COLUMNS_UpdateD返回多個(gè)字節(jié),最左邊的為最不重要的字節(jié)。在Insert操作中COLUMNS_UpdateD將對(duì)所有列返回TRUE值,因?yàn)檫@些列插入了顯式值或隱性(NULL)值??梢栽谟|發(fā)器主體中的任意位置使用COLUMNS_UpdateD。bitwise_operator是用于比較運(yùn)算的位運(yùn)算符。updated_bitmask是整型位掩碼,表示實(shí)際更新或插入的列。例如,表t1包含列C1、C2、C3、C4和C5。假定表
11、t1上有Updae觸發(fā)器,若要檢查列C2、C3和C4是否都有更新,指定值14;若要檢查是否只有列C2有更新,指定值2。comparison_operator是比較運(yùn)算符。使用等號(hào)(=)檢查updated_bitmask中指定的所有列是否都實(shí)際進(jìn)行了更新。使用大于號(hào)(>)檢查updated_bitmask中指定的任一列或某些列是否已更新。column_bitmask是要檢查的列的整型位掩碼,用來檢查是否已更新或插入了這些列。注釋觸發(fā)器常常用于強(qiáng)制業(yè)務(wù)規(guī)則和數(shù)據(jù)完整性。SQLServer通過表創(chuàng)建語句(AlterTABLE和CreateTABLE)提供聲明引用完整性(DRI);但是DRI不提
12、供數(shù)據(jù)庫(kù)間的引用完整性。若要強(qiáng)制引用完整性(有關(guān)表的主鍵和外鍵之間關(guān)系的規(guī)則),請(qǐng)使用主鍵和外鍵約束(AlterTABLE和CreateTABLE的PRIMARYKEY和FOREIGNKEY關(guān)鍵字)。如果觸發(fā)器表存在約束,則在INSTEADOF觸發(fā)器執(zhí)行之后和AFTER觸發(fā)器執(zhí)行之前檢查這些約束。如果違反了約束,則回滾INSTEADOF觸發(fā)器操作且不執(zhí)行(激發(fā))AFTER觸發(fā)器??捎胹p_settriggerorder指定表上第一個(gè)和最后一個(gè)執(zhí)行的AFTER觸發(fā)器。在表上只能為每個(gè)Insert、Update和Delete操作指定一個(gè)第一個(gè)執(zhí)行和一個(gè)最后一個(gè)執(zhí)行的AFTER觸發(fā)器。如果同一表上還
13、有其它AFTER觸發(fā)器,則這些觸發(fā)器將以隨機(jī)順序執(zhí)行。如果AlterTRIGGER語句更改了第一個(gè)或最后一個(gè)觸發(fā)器,則將除去已修改觸發(fā)器上設(shè)置的第一個(gè)或最后一個(gè)特性,而且必須用sp_settriggerorder重置排序值。只有當(dāng)觸發(fā)SQL語句(包括所有與更新或刪除的對(duì)象關(guān)聯(lián)的引用級(jí)聯(lián)操作和約束檢查)成功執(zhí)行后,AFTER觸發(fā)器才會(huì)執(zhí)行。AFTER觸發(fā)器檢查觸發(fā)語句的運(yùn)行效果,以及所有由觸發(fā)語句引起的Update和Delete引用級(jí)聯(lián)操作的效果。觸發(fā)器限制CreateTRIGGER必須是批處理中的第一條語句,并且只能應(yīng)用到一個(gè)表中。觸發(fā)器只能在當(dāng)前的數(shù)據(jù)庫(kù)中創(chuàng)建,不過觸發(fā)器可以引用當(dāng)前數(shù)據(jù)庫(kù)的
14、外部對(duì)象。如果指定觸發(fā)器所有者名稱以限定觸發(fā)器,請(qǐng)以相同的方式限定表名。在同一條CreateTRIGGER語句中,可以為多種用戶操作(如Insert和Update)定義相同的觸發(fā)器操作。如果一個(gè)表的外鍵在Delete/Update操作上定義了級(jí)聯(lián),則不能在該表上定義INSTEADOFDelete/Update觸發(fā)器。在觸發(fā)器內(nèi)可以指定任意的SET語句。所選擇的SET選項(xiàng)在觸發(fā)器執(zhí)行期間有效,并在觸發(fā)器執(zhí)行完后恢復(fù)到以前的設(shè)置。與使用存儲(chǔ)過程一樣,當(dāng)觸發(fā)器激發(fā)時(shí),將向調(diào)用應(yīng)用程序返回結(jié)果。若要避免由于觸發(fā)器激發(fā)而向應(yīng)用程序返回結(jié)果,請(qǐng)不要包含返回結(jié)果的Select語句,也不要包含在觸發(fā)器中進(jìn)行變
15、量賦值的語句。包含向用戶返回結(jié)果的Select語句或進(jìn)行變量賦值的語句的觸發(fā)器需要特殊處理;這些返回的結(jié)果必須寫入允許修改觸發(fā)器表的每個(gè)應(yīng)用程序中。如果必須在觸發(fā)器中進(jìn)行變量賦值,則應(yīng)該在觸發(fā)器的開頭使用SETNOCOUNT語句以避免返回任何結(jié)果集。Delete觸發(fā)器不能捕獲TRUNCATETABLE語句。盡管TRUNCATETABLE語句實(shí)際上是沒有Where子句的Delete(它刪除所有行),但它是無日志記錄的,因而不能執(zhí)行觸發(fā)器。因?yàn)門RUNCATETABLE語句的權(quán)限默認(rèn)授予表所有者且不可轉(zhuǎn)讓,所以只有表所有者才需要考慮無意中用TRUNCATETABLE語句規(guī)避Delete觸發(fā)器的問題
16、。無論有日志記錄還是無日志記錄,WRITETEXT語句都不激活觸發(fā)器。觸發(fā)器中不允許以下Transact-SQL語句:AlterDATABASECreateDATABASEDISKINITDISKRESIZEDropDATABASELOADDATABASELOADLOGRECONFIGURERESTOREDATABASERESTORELOG說明由于SQLServer不支持系統(tǒng)表中的用戶定義觸發(fā)器,因此建議不要在系統(tǒng)表中創(chuàng)建用戶定義觸發(fā)器。多個(gè)觸發(fā)器SQLServer允許為每個(gè)數(shù)據(jù)修改事件(Delete、Insert或Update)創(chuàng)建多個(gè)觸發(fā)器。例如,如果對(duì)已有Update觸發(fā)器的表執(zhí)行Cre
17、ateTRIGGERFORUpdate,則將創(chuàng)建另一個(gè)更新觸發(fā)器。在早期版本中,在每個(gè)表上,每個(gè)數(shù)據(jù)修改事件(Insert、Update或Delete)只允許有一個(gè)觸發(fā)器。說明如果觸發(fā)器名稱不同,則CreateTRIGGER(兼容級(jí)別為70)的默認(rèn)行為是在現(xiàn)有的觸發(fā)器中添加其它觸發(fā)器。如果觸發(fā)器名稱相同,則SQLServer返回一條錯(cuò)誤信息。但是,如果兼容級(jí)別等于或小于65,則使用CreateTRIGGER語句創(chuàng)建的新觸發(fā)器將替換同一類型的任何現(xiàn)有觸發(fā)器,即使觸發(fā)器名稱不同。有關(guān)更多信息,請(qǐng)參見sp_dbcmptlevel。遞歸觸發(fā)器當(dāng)在sp_dboption中啟用recursivetrigg
18、ers設(shè)置時(shí),SQLServer還允許觸發(fā)器的遞歸調(diào)用。遞歸觸發(fā)器允許發(fā)生兩種類型的遞歸:間接遞歸直接遞歸使用間接遞歸時(shí),應(yīng)用程序更新表T1,從而激發(fā)觸發(fā)器TR1,該觸發(fā)器更新表T2。在這種情況下,觸發(fā)器T2將激發(fā)并更新T1。使用直接遞歸時(shí),應(yīng)用程序更新表T1,從而激發(fā)觸發(fā)器TR1,該觸發(fā)器更新表T1。由于表T1被更新,觸發(fā)器TR1再次激發(fā),依此類推。下例既使用了間接觸發(fā)器遞歸,又使用了直接觸發(fā)器遞歸。假定在表T1中定義了兩個(gè)更新觸發(fā)器TR1和TR2。觸發(fā)器TR1遞歸地更新表T1。Update語句使TR1和TR2各執(zhí)行一次。而TR1的執(zhí)行將觸發(fā)TR1(遞歸)和TR2的執(zhí)行。給定觸發(fā)器的inse
19、rted和deleted表只包含與喚醒調(diào)用觸發(fā)器的Update語句相對(duì)應(yīng)的行。說明只有啟用sp_dboption的recursivetriggers設(shè)置,才會(huì)發(fā)生上述行為。對(duì)于為給定事件定義的多個(gè)觸發(fā)器,并沒有確定的執(zhí)行順序。每個(gè)觸發(fā)器都應(yīng)是自包含的。禁用recursivetriggers設(shè)置只能禁止直接遞歸。若要也禁用間接遞歸,請(qǐng)使用sp_configure將nestedtriggers服務(wù)器選項(xiàng)設(shè)置為0。如果任一觸發(fā)器執(zhí)行了ROLLBACKTRANSACTION語句,則無論嵌套級(jí)是多少,都不會(huì)進(jìn)一步執(zhí)行其它觸發(fā)器。嵌套觸發(fā)器觸發(fā)器最多可以嵌套32層。如果一個(gè)觸發(fā)器更改了包含另一個(gè)觸發(fā)器的表
20、,則第二個(gè)觸發(fā)器將激活,然后該觸發(fā)器可以再調(diào)用第三個(gè)觸發(fā)器,依此類推。如果鏈中任意一個(gè)觸發(fā)器引發(fā)了無限循環(huán),則會(huì)超出嵌套級(jí)限制,從而導(dǎo)致取消觸發(fā)器。若要禁用嵌套觸發(fā)器,請(qǐng)用sp_configure將nestedtriggers選項(xiàng)設(shè)置為0(關(guān)閉)。默認(rèn)配置允許嵌套觸發(fā)器。如果嵌套觸發(fā)器是關(guān)閉的,則也將禁用遞歸觸發(fā)器,與sp_dboption的recursivetriggers設(shè)置無關(guān)。延遲名稱解析SQLServer允許Transact-SQL存儲(chǔ)過程、觸發(fā)器和批處理引用編譯時(shí)不存在的表。這種能力稱為延遲名稱解析。但是,如果Transact-SQL存儲(chǔ)過程、觸發(fā)器或批處理引用在存儲(chǔ)過程或觸發(fā)器中
21、定義的表,則只有當(dāng)兼容級(jí)別設(shè)置(通過執(zhí)行sp_dbcmptlevel設(shè)置)等于65時(shí),才會(huì)在創(chuàng)建時(shí)發(fā)出警告。如果使用批處理,則在編譯時(shí)發(fā)出警告。如果引用的表不存在,將在運(yùn)行時(shí)返回錯(cuò)誤信息。有關(guān)更多信息,請(qǐng)參見延遲名稱解析和編譯。權(quán)限CreateTRIGGER權(quán)限默認(rèn)授予定義觸發(fā)器的表所有者、sysadmin固定服務(wù)器角色成員以及db_owner和db_ddladmin固定數(shù)據(jù)庫(kù)角色成員,并且不可轉(zhuǎn)讓。若要檢索表或視圖中的數(shù)據(jù),用戶必須在表或視圖中擁有Select語句權(quán)限。若要更新表或視圖的內(nèi)容,用戶必須在表或視圖中擁有Insert、Delete和Update語句權(quán)限。如果視圖中存在INSTEA
22、DOF觸發(fā)器,用戶必須在該視圖中有Insert、Delete和Update特權(quán),以對(duì)該視圖發(fā)出Insert、Delete和Update語句,而不管實(shí)際上是否在視圖上執(zhí)行了這樣的操作。示例A.使用帶有提醒消息的觸發(fā)器當(dāng)有人試圖在titles表中添加或更改數(shù)據(jù)時(shí),下例將向客戶端顯示一條消息。說明消息50009是sysmessages中的用戶定義消息。有關(guān)創(chuàng)建用戶定義消息的更多信息,請(qǐng)參見sp_addmessage。USEpubsIFEXISTS(SelectnameFROMsysobjectsWherename='reminder'ANDtype='TR')Drop
23、TRIGGERreminderGOCreateTRIGGERreminderONtitlesFORInsert,UpdateASRAISERROR(50009,16,10)GOB. 使用帶有提醒電子郵件的觸發(fā)器當(dāng)titles表更改時(shí),下例將電子郵件發(fā)送給指定的人員(MaryM)。USEpubsIFEXISTS(SelectnameFROMsysobjectsWherename='reminder'ANDtype='TR')DropTRIGGERreminderGOCreateTRIGGERreminderONtitlesFORInsert,Update,Dele
24、teASEXECmaster.xp_sendmail'MaryM','Don''tforgettoprintareportforthedistributors.'GOC. 在employee和jobs表之間使用觸發(fā)器業(yè)務(wù)規(guī)則由于CHECK約束只能引用定義了列級(jí)或表級(jí)約束的列,表間的任何約束(在下例中是指業(yè)務(wù)規(guī)則)都必須定義為觸發(fā)器。下例創(chuàng)建一個(gè)觸發(fā)器,當(dāng)插入或更新雇員工作級(jí)別(job_lvls)時(shí),該觸發(fā)器檢查指定雇員的工作級(jí)別(由此決定薪水)是否處于為該工作定義的范圍內(nèi)。若要獲得適當(dāng)?shù)姆秶?,必須引用jobs表。USEpubsIFEXISTS(S
25、electnameFROMsysobjectsWherename='employee_insupd'ANDtype='TR')DropTRIGGERemployee_insupdGOCreateTRIGGERemployee_insupdONemployeeFORInsert,UpdateAS/*Gettherangeoflevelforthisjobtypefromthejobstable.*/DECLAREmin_lvltinyint,max_lvltinyint,emp_lvltinyint,job_idsmallintSelectmin_lvl=min_
26、lvl,max_lvl=max_lvl,emp_lvl=i.job_lvl,job_id=i.job_idFROMemployeeeINNERJOINinsertediONe.emp_id=i.emp_idJOINjobsjONj.job_id=i.job_idIF(job_id=1)and(emp_lvl10)BEGINRAISERROR('Jobid1expectsthedefaultlevelof10.',16,1)ROLLBACKTRANSACTIONENDELSEIFNOT(emp_lvlBETWEENmin_lvlANDmax_lvl)BEGINRAISERROR(
27、'Thelevelforjob_id:%dshouldbebetween%dand%d.',16,1,job_id,min_lvl,max_lvl)ROLLBACKTRANSACTIONENDD. 使用延遲名稱解析下例創(chuàng)建兩個(gè)觸發(fā)器以說明延遲名稱解析。USEpubsIFEXISTS(SelectnameFROMsysobjectsWherename='trig1'ANDtype='TR')DropTRIGGERtrig1GO- -Creatingatriggeronanonexistenttable.CreateTRIGGERtrig1onaut
28、horsFORInsert,Update,DeleteASSelecta.au_lname,a.au_fname,FROMauthorsaINNERJOINdoes_not_existxONa.au_id=x.au_idGO- -Hereisthestatementtoactuallyseethetextofthetrigger.Selecto.id,c.textFROMsysobjectsoINNERJOINsyscommentscONo.id=c.idWhereo.type='TR'='trig1'- -Creatingatri
29、ggeronanexistingtable,butwithanonexistent- -column.USEpubsIFEXISTS(SelectnameFROMsysobjectsWherename='trig2'ANDtype='TR')DropTRIGGERtrig2GOCreateTRIGGERtrig2ONauthorsFORInsert,UpdateASDECLAREfaxvarchar(12)Selectfax=phoneFROMauthorsGO- -Hereisthestatementtoactuallyseethetextofthetrigg
30、er.Selecto.id,c.textFROMsysobjectsoINNERJOINsyscommentscONo.id=c.idWhereo.type='TR'='trig2'E. 使用COLUMNS_UpdateD下例創(chuàng)建兩個(gè)表:一個(gè)employeeData表和一個(gè)auditEmployeeData表。人力資源部的成員可以修改employeeData表,該表包含敏感的雇員薪水信息。如果更改了雇員的社會(huì)保險(xiǎn)號(hào)碼(SSN)、年薪或銀行帳戶,則生成審核記錄并插入到auditEmployeeData審核表。通過使用COLUMNS_UpdateD
31、()功能,可以快速測(cè)試對(duì)這些包含敏感雇員信息的列所做的更改。只有在試圖檢測(cè)對(duì)表中的前8列所做的更改時(shí),COLUMNS_UpdateD()才起作用。USEpubsIFEXISTS(SelectTABLE_NAMEFROMINFORMATION_SCHEMA.TABLESWhereTABLE_NAME='employeeData')DropTABLEemployeeDataIFEXISTS(SelectTABLE_NAMEFROMINFORMATION_SCHEMA.TABLESWhereTABLE_NAME='auditEmployeeData')DropTABL
32、EauditEmployeeDataGOCreateTABLEemployeeData(emp_idintNOTNULL,emp_bankAccountNumberchar(10)NOTNULL,emp_salaryintNOTNULL,emp_SSNchar(11)NOTNULL,emp_lnamenchar(32)NOTNULL,emp_fnamenchar(32)NOTNULL,emp_managerintNOTNULL)GOCreateTABLEauditEmployeeData(audit_log_iduniqueidentifierDEFAULTNEWID(),audit_log_
33、typechar(3)NOTNULL,audit_emp_idintNOTNULL,audit_emp_bankAccountNumberchar(10)NULL,audit_emp_salaryintNULL,audit_emp_SSNchar(11)NULL,audit_usersysnameDEFAULTSUSER_SNAME(),audit_changeddatetimeDEFAULTGETDATE()GOCreateTRIGGERupdEmployeeDataONemployeeDataFORupdateAS/*Checkwhethercolumns2,3or4hasbeenupda
34、ted.Ifanyorallofcolumns2,3or4havebeenchanged,createanauditrecord.Thebitmaskis:power(2,(2-1)+power(2,(3-1)+power(2,(4-1)=14. Tocheckifallcolumns2,3,and4areupdated,use=14inplaceof>0(below).*/IF(COLUMNS_UpdateD()&14)>0/*UseIF(COLUMNS_UpdateD()&14)=14toseeifallofcolumns2,3,and4areupdated.*
35、/BEGIN-AuditOLDrecord.InsertINTOauditEmployeeData(audit_log_type,audit_emp_id,audit_emp_bankAccountNumber,audit_emp_salary,audit_emp_SSN)Select'OLD',del.emp_id,del.emp_bankAccountNumber,del.emp_salary,del.emp_SSNFROMdeleteddel-AuditNEWrecord.InsertINTOauditEmployeeData(audit_log_type,audit_emp_id,audit_emp_bankAccountNumber,audit_emp_salary,audit_emp_SSN)Select'NEW',ins.emp_id,ins.emp_bankAcc
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 3人工智能應(yīng)用29課件
- 2025年STEAM教育在中小學(xué)的推廣模式與效果評(píng)價(jià)報(bào)告
- 地理●福建卷丨2024年福建省普通高中學(xué)業(yè)水平選擇性考試地理試卷及答案
- 三零五帶七抓管理體系
- 初中數(shù)學(xué)九年級(jí)下冊(cè)統(tǒng)編教案 5.1二次函數(shù)教案
- DeepSeek高教應(yīng)用場(chǎng)景規(guī)劃方案
- 2025年全民創(chuàng)建衛(wèi)生城市知識(shí)競(jìng)賽試題200題(附答案)
- 消防試題及答案
- 西方管理思想試題及答案
- 地理●全國(guó)甲卷丨2023年普通高等學(xué)校招生全國(guó)統(tǒng)一考試地理試卷及答案
- 景觀園林設(shè)計(jì)收費(fèi)的標(biāo)準(zhǔn)
- 京東考試答案
- (完整版)澳洲不隨行父母同意函
- 遞進(jìn)式流程通用模板PPT
- 腦損傷病情觀察意識(shí)狀態(tài)的分級(jí)
- 請(qǐng)假通用員工請(qǐng)假單模板
- 客訴處理與應(yīng)對(duì)技巧
- 麥凱66客戶檔案管理表格
- 框架六層中學(xué)教學(xué)樓工程施工方案
- 淺析Zabbix平臺(tái)在電力企業(yè)信息設(shè)備監(jiān)控中的應(yīng)用
- 螯合樹脂資料
評(píng)論
0/150
提交評(píng)論