目錄
1. 触发器的类型
2. 实现原理
3. After触发器 Vs Instead Of触发器
4. DML 触发器 Vs DDL 触发器
5. 触发器and事务
6. 下面描述三种常见触发器中事务的情况:
7. 2、 instead of 触发器 (之前触发)
8. 触发器有两个特殊的表:插入表(instered表)和删除表(deleted表)。
9. 表格记录复制and迁移SELECT INTO 和 INSERT INTO SELECT
10. 参考
首頁 資料庫 mysql教程 atitit...触发器机制ltriggermechanismsumup.的总结O8f

atitit...触发器机制ltriggermechanismsumup.的总结O8f

Jun 07, 2016 pm 04:00 PM
機制 觸發器

atitit...触发器机制 ltrigger mechanism sumup .的总结O8f 1. 触发器的类型 1 2. 实现原理 1 3. After触发器 Vs Instead Of触发器 1 4. DML 触发器 Vs DDL 触发器 3 5. 触发器and事务 3 6. 下面描述三种常见触发器中事务的情况: 5 7. 2、 instead of 触发

atitit...触发器机制 ltrigger mechanism sumup .的总结O8f

1. 触发器的类型 1

2. 实现原理 1

3. After触发器 Vs Instead Of触发器 1

4. DML 触发器 Vs DDL 触发器 3

5. 触发器and事务 3

6. 下面描述三种常见触发器中事务的情况: 5

7. 2、 instead of 触发器 (之前触发) 7

8. 触发器有两个特殊的表:插入表(instered表)和删除表(deleted表)。 7

9. 表格记录复制and迁移SELECT INTO 和 INSERT INTO SELECT 8

10. 参考 9

1. 触发器的类型

· DML触发器(DML Triggers)

· DDL触发器(DDL Triggers)

· 事务模式(Transaction modes)

· 显式事务(Explicit Transactions)

· 自动提交事务(Autocommit Transactions)

· 隐式事务(Implicit Transactions)

· 批范围的事务(Batch-scoped Transactions)

2. 实现原理

3. After触发器 Vs Instead Of触发器

After 触发器将在处理触发操作(Insert、Update 或 Delete)、Instead Of 触发器和约束之后激发。Instead Of是将在处理约束前激发,以替代触发操作。下面两张图描述了After触发器和Instead Of触发器的执行先后顺序。

作者::老哇的爪子Attilax艾龙,EMAIL:1466519819@qq.com

转载请注明来源: http://blog.csdn.net/attilax 

图1 图2

4. DML 触发器 Vs DDL 触发器

DML 触发器在 Insert、Update 和 Delete 语句上操作,可以作为After 触发器 和 Instead Of 触发器。

DDL 触发器对 Create、Alter、Drop 和其他 DDL 语句以及执行 DDL 式操作的存储过程执行操作,只可作为After触发器,不能Instead Of触发器。

前面的内容,有描述DML触发器中的After & Instead Of触发器内容,下面直接来看DDL的操作顺序:

图3.

从图3.可以知道,在DDL触发器中,是没有创建Inserted & Deleted过程的,我们通过简单的例子去测试下

5. 触发器and事务

看出,Update Contact触发tr_Contact触发器操作,触发器里面的Rollback Tran 动作导致了触发器外面的Update语句执行回滚,而Rollback Tran 语句后面的Begin Tran语句,主要是应用于保持整个事务的完整性。为了更能理解这一过程,我模拟了一个触发器中的事务开始结束过程。

图4.

在SQL Server 2005 和 SQL Server 2008上面,可以看到如图4.的效果。在低版本的SQL Server上,可能会出现错误提示情况,不管如何,在触发器外面,SQL Server都会Rollback Tran。下面我做个错误提示的例子。

不管如何,在触发器外面,SQL Server都会Rollback Tran。下面我做个错误提示的例子。

在触发器里面没有Begin Tran语句动作,触发器外面也能回滚操作。这里我们可以通过查询表数据和@@Trancount来判断。

其实,上面的例子,Update语句,是以自动提交事务(Autocommit Transactions)模式 开始执行的,触发器里Rollback Tran后面,不管有没有Begin Tran ,最后都会事务都会交回给SQL Server自动提交事务管理。当然,在DML触发器中,你可以使用显式事务(Explicit Transactions),或开启隐式事务(Implicit Transactions) 来控制,当然你也可以应用于批范围的事务(Batch-scoped Transactions) 中。这里,我通过开启隐式事务(Implicit Transactions) 的例子来说,触发器与事务的关系。

这里,你是否发现一个很有意思的问题,在触发器理,执行Insert ContactHIST之前,@@Trancount=1,执行Insert后,@@Trancount还是为1,触发器外面Update Contact后,@@Trancount就变成了2,。这里可以理解成,你在触发器里面,发出一个Begin Tran,那么SQL Server 就会创建一个嵌套事务。当你在触发器里面,在Rollback Tran后面屏蔽掉Begin Tran,就会出现错误3609,如,

6. 下面描述三种常见触发器中事务的情况:

图5. 图6. 图7.

图5.描述在触发器中含有Begin Tran …… Commit Tran的情况,

图6.描述在触发器中含有Save Tran savepoint_name …… Rollback Tran savepoint_name 的情况,触发器中的Rollback Tran 只会回滚指定的保存点,不会影响到触发器外面的Commit Tran Or Rollback Tran操作。

图7.描述在触发器中含有Rollback Tran的情况,不管触发器里面有没有Begin Tran,都会出现错误3609,中止批处理。

注:DDL触发器操作可 以触发器中回滚操作,可以使用命令如Rollback,但严重错误可能会导致整个事务自动回滚。不能回滚发生在 DDL 触发器正文内的 Alter Database事件。在触发器中使用Rollback … Begin Tran 可能会导致意想不到的结果,在没有确认和测试情况下,请不要随便在触发器中直接使用Rollback …Begin Tran处理方式.特别是Create Database事件,在SQL Server 2008和SQL Server 2005环境下,产生的结果不同。

7. 2、 instead of 触发器 (之前触发)

其中after触发器要求只有执行某一操作insert、update、delete之后触发器才被触发,且只能定义在表上。而instead of触发器表示并不执行其定义的操作(insert、update、delete)而仅是执行触发器本身。既可以在表上定义instead of触发器,也可以在视图上定义。

8. 触发器有两个特殊的表:插入表(instered表)和删除表(deleted表)。

这两张是逻辑表也是虚表。有系统在内存中创建者两张表,不会存储在数 据库中。而且两张表的都是只读的,只能读取数据而不能修改数据。这两张表的结果总是与被改触发器应用的表的结构相同。当触发器完成工作后,这两张表就会被 删除。Inserted表的数据是插入或是修改后的数据,而deleted表的数据是更新前的或是删除的数据。

对表的操作

Inserted逻辑表

Deleted逻辑表

增加记录(insert)

存放增加的记录

删除记录(delete)

存放被删除的记录

修改记录(update)

存放更新后的记录

存放更新前的记录

Update数据的时候就是先删除表记录,然后增加一条记录。这样在inserted和deleted表就都有update后的数据记录了。注意的是:触 发器本身就是一个事务,所以在触发器里面可以对修改数据进行一些特殊的检查。如果不满足可以利用事务回滚,撤销操作。

9. 表格记录复制and迁移SELECT INTO 和 INSERT INTO SELECT

Insert是T-sql中常用语句,Insert INTO table(field1,field2,...) values(value1,value2,...)这种形式的在应用程序开发中必不可少。但我们在开发、测试过程中,经常会遇到需要表复制的情况,如将 一个table1的数据的部分字段复制到table2中,或者将整个table1复制到table2中,这时候我们就要使用SELECT INTO 和 INSERT INTO SELECT 表复制语句了。

SELECT INTO 要新的建立表格...INSERT INTO SELECT 可以存在的表格insert 数据..所以,还是.INSERT INTO SELECT 使用的常用...

ALTER TRIGGER [dbo].[trg_inst]

ON [dbo].[t_mb_weixinuser]

AFTER INSERT

AS

BEGIN

-- SET NOCOUNT ON added to prevent extra result sets from

-- interfering with SELECT statements.

SET NOCOUNT ON;

Insert into wechatuhstry(userid, [subscribe] ,[openid] ,[subscribe_time],[groupid] ,[createTime] ,[updateTime] ,nickname) select userid,[subscribe] ,[openid] ,[subscribe_time],[groupid] ,[createTime] ,[updateTime] ,nickname from inserted;

-- Insert statements for trigger here

END

#----最佳实践

copy2表格的id自动incream最好关闭..中间id一样..分享一样的主键.

text类型的不能copy,只好指定字段了...

#---rest风格安全可以多次复制

Insert into wechatuhstry

select top 100000 * from t_mb_weixinuser where UserID not in

(select UserID from wechatuhstry)

10. 参考

SQL Server 触发器 - hoojo - 博客园.htm

了解SQL Server触发器及触发器中的事务 - OK_008 - 博客园.htm

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1666
14
CakePHP 教程
1425
52
Laravel 教程
1324
25
PHP教程
1272
29
C# 教程
1251
24
如何隱藏文字直到在 Powerpoint 中單擊 如何隱藏文字直到在 Powerpoint 中單擊 Apr 14, 2023 pm 04:40 PM

如何在 PowerPoint 中的任何點擊之前隱藏文本如果您希望在單擊 PowerPoint 幻燈片上的任意位置時顯示文本,那麼設置起來既快速又容易。若要在 PowerPoint 中按一下任何按鈕之前隱藏文字:開啟您的 PowerPoint 文檔,然後按一下「插入 」功能表。點選新幻燈片。選擇空白或其他預設之一。仍然在插入選單中,按一下文字方塊。在投影片上拖出一個文字方塊。點擊文字方塊並輸入您

深入了解CSS佈局重新計算與渲染的機制 深入了解CSS佈局重新計算與渲染的機制 Jan 26, 2024 am 09:11 AM

CSS回流(reflow)和重繪(repaint)是網頁效能優化中非常重要的概念。在開發網頁時,了解這兩個概念的工作原理,可以幫助我們提高網頁的回應速度和使用者體驗。本文將深入探討CSS回流和重繪的機制,並提供具體的程式碼範例。一、CSS回流(reflow)是什麼?當DOM結構中的元素發生視覺性、尺寸或位置改變時,瀏覽器需要重新計算並套用CSS樣式,然後重新佈局

如何在MySQL中使用PHP編寫觸發器 如何在MySQL中使用PHP編寫觸發器 Sep 21, 2023 am 08:16 AM

如何在MySQL中使用PHP編寫觸發器MySQL是一種常用的關係型資料庫管理系統,而PHP是一種流行的伺服器端腳本語言。在MySQL中使用PHP編寫觸發器可以幫助我們實現自動化的資料庫操作。本文將介紹如何使用PHP來撰寫MySQL觸發器,並提供具體的程式碼範例。在開始之前,請確保已經安裝了MySQL和PHP,並且已經建立了相應的資料庫表。一、創建PHP檔案和數據

如何在MySQL中使用PHP編寫自訂觸發器和預存程序 如何在MySQL中使用PHP編寫自訂觸發器和預存程序 Sep 20, 2023 am 11:25 AM

如何在MySQL中使用PHP編寫自訂觸發器和預存程序引言:在開發應用程式時,我們經常需要在資料庫層面進行一些操作,例如插入、更新或刪除資料。 MySQL是一個廣泛使用的關聯式資料庫管理系統,而PHP是一種流行的伺服器端腳本語言。本文將介紹如何在MySQL中使用PHP編寫自訂觸發器和預存流程,並提供具體的程式碼範例。一、什麼是觸發器和預存程序觸發器(Trigg

oracle如何添加觸發器 oracle如何添加觸發器 Dec 12, 2023 am 10:17 AM

在Oracle資料庫中,您可以使用CREATE TRIGGER語句來新增觸發器。觸發器是一種資料庫對象,它可以在資料庫表上定義一個或多個事件,並在事件發生時自動執行相應的操作。

如何在MySQL中使用Python編寫自訂觸發器 如何在MySQL中使用Python編寫自訂觸發器 Sep 20, 2023 am 11:04 AM

如何在MySQL中使用Python編寫自訂觸發器觸發器是MySQL中的一種強大的功能,它可以在資料庫中的表上定義一些自動執行的操作。而Python則是一種簡潔而強大的程式語言,能夠方便地與MySQL進行互動。本文將介紹如何使用Python編寫自訂觸發器,並提供具體的程式碼範例。首先,我們需要安裝並匯入PyMySQL函式庫,它是Python與MySQL資料庫進行

PHP中的自動載入機制 PHP中的自動載入機制 Jun 18, 2023 pm 01:11 PM

隨著PHP語言越來越受歡迎,開發人員需要使用越來越多的類別和函數。當專案規模擴大時,手動引入所有依賴項將變得不切實際。這時候就需要一種自動載入機制來簡化程式碼開發和維護過程。自動載入機制是一種PHP語言的特性,可以在運行時自動載入所需的類別和接口,並減少手動的類別文件引入。這樣,程式設計師可以專注於開發程式碼,減少因繁瑣的手動類別引入而產生的錯誤和時間浪費。在PHP中,一般

MySQL觸發器中參數的使用方法 MySQL觸發器中參數的使用方法 Mar 16, 2024 am 09:27 AM

MySQL觸發器是一種在資料庫管理系統中用於監控特定資料表的操作,並根據預先定義的條件執行對應操作的特殊程序。在建立MySQL觸發器時,我們可以使用參數來靈活地傳遞資料和訊息,讓觸發器更具通用性和適用性。在MySQL中,觸發器可以在特定表的INSERT、UPDATE、DELETE操作前或後觸發執行對應的邏輯。使用參數可以使得觸發器更具靈活性,可以根據需要傳遞需要

See all articles