日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

SQL Server基礎(chǔ)概念--觸發(fā)器 <>

系統(tǒng) 2351 0

觸發(fā)器是一種實(shí)施復(fù)雜的完整性約束的特殊存儲(chǔ)過程。它在 SQL Server 進(jìn)行某個(gè)特定的表修改時(shí)由 SQL Server 自動(dòng)執(zhí)行。觸發(fā)器一般用于加強(qiáng)數(shù)據(jù)庫的某些使用規(guī)則。當(dāng)普通的約束(包括 CHECK 機(jī)制、 DEFAULT 機(jī)制、 RULE 機(jī)制)不足于加強(qiáng)數(shù)據(jù)的完整性時(shí),就可以考慮使用觸發(fā)器。觸發(fā)器對(duì)于那些為不同的商務(wù)軟件提供后臺(tái)數(shù)據(jù)服務(wù)的大型系統(tǒng)特別有用。因?yàn)橛|發(fā)器可以為數(shù)據(jù)庫建立獨(dú)立于具體客戶端軟件的完整性規(guī)則。

?

觸發(fā)器和表是緊密聯(lián)系在一起的,任何觸發(fā)器都是在特定的表上進(jìn)行定義的,該表也稱為觸發(fā)器的觸發(fā)表。由于在觸發(fā)器中可以包含復(fù)雜的處理邏輯,因而在 下列情況 下應(yīng)該 考慮使用觸發(fā)器

(1) ????? 強(qiáng)制比 CHECK 約束復(fù)雜的數(shù)據(jù)完整性。如需要引用其他表數(shù)據(jù)的檢查是無法通過 CHECK 約束完成的,必須使用觸發(fā)器加以實(shí)現(xiàn)。

(2) ????? 使用自定義的錯(cuò)誤信息。通過觸發(fā)器,用戶可以捕獲破壞數(shù)據(jù)完整性的各種操作,并自由地調(diào)用預(yù)先定義的錯(cuò)誤信息或動(dòng)態(tài)地定制錯(cuò)誤信息。約束、規(guī)則和默認(rèn)值只能通過標(biāo)準(zhǔn)的系統(tǒng)錯(cuò)誤信息傳遞錯(cuò)誤信息。如果應(yīng)用程序要求定制的錯(cuò)誤信息和執(zhí)行更加復(fù)雜的錯(cuò)誤處理,那么必須使用觸發(fā)器。

(3) ????? 實(shí)現(xiàn)數(shù)據(jù)庫中多張表的級(jí)聯(lián)修改。

(4) ????? 比較數(shù)據(jù)庫修改前后數(shù)據(jù)的狀態(tài)。大多數(shù)觸發(fā)器都提供了跟蹤 INSERT UPDATE DELETE 語句引起的數(shù)據(jù)變化的能力。因此用戶可以方便地在觸發(fā)器中找出或訪問由于修改而發(fā)生數(shù)據(jù)變化的記錄行。

(5) ????? 維護(hù)非規(guī)范數(shù)據(jù)。用戶可以使用觸發(fā)器來保證非規(guī)范數(shù)據(jù)庫環(huán)境中低級(jí)數(shù)據(jù)的完整性。

?

創(chuàng)建觸發(fā)器的 語法格式 如下:

CREATE TRIGGER trigger_name

ON { table | view }

[ WITH ENCRYPTION ]

{ FOR | AFTER |INSTEAD OF } { [INSERT] [,] [UPDATE] [,] [DELETE] }

AS

????? [{ IF UPDATE (column_name) }]

????? [{ AND | OR } UPDATE (column_name) ]

????? Sql_statement [ n]

其中,部分 參數(shù)含義 如下:

(1) ???? trigger_name :所建立的觸發(fā)器的名稱。觸發(fā)器的命名必須遵循 SQL Server 標(biāo)示符的命名約定,并且在數(shù)據(jù)庫中必須唯一。

(2) ???? table|view: 在其上建立觸發(fā)器的基表或視圖,有時(shí)也稱為觸發(fā)器表或觸發(fā)器視圖。

(3) ???? INSERT,UPDATE DELETE :該關(guān)鍵字指定當(dāng)在表或視圖上執(zhí)行哪些數(shù)據(jù)修改操作時(shí)將激活觸發(fā)器。 SQL Server 允許同一個(gè)觸發(fā)器被一種或多種操作觸發(fā)。

(4) ???? IF UPDATE column_name ):指定當(dāng)對(duì)基表內(nèi)的某字段或某幾個(gè)字段進(jìn)行插入( INSERT )或修改( UPDATE )時(shí),觸發(fā)才起作用。

(5) ???? Sql_statement :觸發(fā)器在被觸發(fā)之后所執(zhí)行的數(shù)據(jù)庫操作。在 SQL Server 中,一個(gè)觸發(fā)器能夠包含任意數(shù)量的 SQL 語句。

?

觸發(fā)器雖然在強(qiáng)制數(shù)據(jù)完整性方面有著十分重要的地位,但是,作為一種 特殊存儲(chǔ)過程 ,它還有以下 幾點(diǎn)約束

(1) ???? 如果在一段批處理命令中使用 CREATE TRIGGER 命令時(shí), CREATE TRIGGER 命令必須是批處理命令的第一條。

(2) ???? 在表中如果既有約束又有觸發(fā)器,則在執(zhí)行時(shí),約束優(yōu)先于觸發(fā)器。而且如果在操作中觸發(fā)器與約束發(fā)生沖突,觸發(fā)器將不執(zhí)行。

(3) ???? 不允許在觸發(fā)器程序中出現(xiàn)下列語句,否則 SQL Server 將拒絕執(zhí)行:

???????????????????? i. ?????? 任何數(shù)據(jù)庫對(duì)象的創(chuàng)建指令。例如: CREATE DATABASE,CREATE TABLE CREATE INDEX

??????????????????? ii. ?????? 任何數(shù)據(jù)庫對(duì)象的刪除指令。如 DROP DATABASE,CREATE TABLE,DROP PROCEDURE

?????????????????? iii. ?????? 所有的對(duì)象修改語句,如 ALTER TABLE ALTER DATABASE.

??????????????????? iv. ?????? TRIMCATE TABLE 命令

???????????????????? v. ?????? SELECT INTO 命令

??????????????????? vi. ?????? 權(quán)限命令( GRANT REVOKE

?????????????????? vii. ?????? UPDATE STATISTICS 語句

????????????????? viii. ?????? SELECT INTO (因?yàn)樵撜Z句創(chuàng)建了一個(gè)表)

??????????????????? ix. ?????? RECONFIGURE 語句

???????????????????? x. ?????? LOAD,RESTORE DATABASE LOG

??????????????????? xi. ?????? 所有的磁盤操作命令

?

(4) ???? 觸發(fā)器不允許創(chuàng)建在特定的表格上,雖然在創(chuàng)建時(shí)不會(huì)提示任何的錯(cuò)誤,但所創(chuàng)建的觸發(fā)器不會(huì)有任何作用。

(5) ???? TRUNCATE 命令不能觸發(fā)可以被 DELETE 操作觸發(fā)的觸發(fā)器。

?

Inserted 表和 deleted 表是觸發(fā)器專用的 臨時(shí)虛擬表 。在 UPDATE 類型的觸發(fā)器中,兩者均有, INSERT 中包含 inserted 表, DELETE 中包含 deleted 表。且他們只能由創(chuàng)建他們的觸發(fā)器引用。觸發(fā)器工作完成后,與該觸發(fā)器相關(guān)的兩個(gè)表也會(huì)被刪除。

?

INSERT 觸發(fā)器和 UPDATE 觸發(fā)器常用語確保用戶某些復(fù)雜的、特殊的商業(yè)規(guī)則,并保證數(shù)據(jù)在插入數(shù)據(jù)表之前是有效的。 DELETE 觸發(fā)器主要有兩個(gè)用途 :首先是防止用戶的錯(cuò)誤的刪除操作;其次是在用戶刪除某個(gè)記錄時(shí),自動(dòng)實(shí)施級(jí)聯(lián)刪除,確保數(shù)據(jù)完整性。

?

如果在某觸發(fā)器的執(zhí)行過程中修改了另一個(gè)表,并觸發(fā)了該表的觸發(fā)器,這種情況稱為 觸發(fā)器嵌套 。使用嵌套觸發(fā)器時(shí),應(yīng)考慮下列因素:

(1) ???? 在默認(rèn)情況下,觸發(fā)器不允許遞歸調(diào)用。也就是說,觸發(fā)器不能自己觸發(fā)自己。

(2) ???? 因?yàn)橐粋€(gè)觸發(fā)器是一個(gè)事務(wù),所以在嵌套觸發(fā)器中,如果任意一點(diǎn)失敗,那么整個(gè)事務(wù)和數(shù)據(jù)的修改將全部回滾(數(shù)據(jù)完整性的一種保護(hù)機(jī)制),如果調(diào)試的話,請(qǐng)?jiān)谄渲刑砑舆m當(dāng)?shù)拇蛴⌒畔ⅰ?

?

查看觸發(fā)器信息 可以使用以下的系統(tǒng)存儲(chǔ)過程:

(1) ???? sp_depends<tablename> :用于查看觸發(fā)器的名稱。

(2) ???? sp_helptigger<tablename> :用于查看觸發(fā)器的類型和擁有者等初步的信息。

(3) ???? sp_helptext<triggername> :用于查看觸發(fā)器的定義文本。

?

SQL 企業(yè)管理器中,不能直接刪除觸發(fā)器,因此, 刪除觸發(fā)器 只能使用 T-SQL 中的 DROP TRIGGER 語句

?

ref: http://blog.csdn.net/guilin_gavin/archive/2009/01/09/3742065.aspx ?

ref: http://database.51cto.com/art/200904/118363.htm ?

SQL Server基礎(chǔ)概念--觸發(fā)器 <>


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦?。。?/p>

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 龙胜| 武鸣县| 名山县| 富蕴县| 浦北县| 出国| 扎赉特旗| 闽清县| 丰县| 收藏| 开江县| 衡阳县| 张家口市| 黄龙县| 开化县| 汉阴县| 伊春市| 南和县| 深水埗区| 巨野县| 天峨县| 汉沽区| 拜泉县| 濮阳市| 屏东县| 开封市| 抚顺市| 滨海县| 永定县| 马山县| 东平县| 平陆县| 抚顺县| 迭部县| 望都县| 获嘉县| 大丰市| 武安市| 明溪县| 视频| 汝南县|