下載吧 - 綠色安全的游戲和軟件下載中心

軟件下載吧

當前位置:軟件下載吧 > 數(shù)據(jù)庫 > MS_SQL > SQL開發(fā)知識:關于SQL Server數(shù)據(jù)庫觸發(fā)器詳解

SQL開發(fā)知識:關于SQL Server數(shù)據(jù)庫觸發(fā)器詳解

時間:2024-02-05 12:47作者:下載吧人氣:47

前言

SQL Server觸發(fā)器在非常有爭議的主題。它們能以較低的成本提供便利,但經(jīng)常被開發(fā)人員、DBA誤用,導致性能瓶頸或維護性挑戰(zhàn)。

本文簡要回顧了觸發(fā)器,并深入討論了如何有效地使用觸發(fā)器,以及何時觸發(fā)器會使開發(fā)人員陷入難以逃脫的困境。

雖然本文中的所有演示都是在SQL Server中進行的,但這里提供的建議是大多數(shù)數(shù)據(jù)庫通用的。觸發(fā)器帶來的挑戰(zhàn)在MySQL、PostgreSQL、MongoDB和許多其他應用中也可以看到。

什么是觸發(fā)器

可以在數(shù)據(jù)庫或表上定義SQL Server觸發(fā)器,它允許代碼在發(fā)生特定操作時自動執(zhí)行。本文主要關注表上的DML觸發(fā)器,因為它們往往被過度使用。相反,數(shù)據(jù)庫的DDL觸發(fā)器通常更集中,對性能的危害更小。

觸發(fā)器是對表中數(shù)據(jù)更改時進行計算的一組代碼。觸發(fā)器可以定義為在插入、更新、刪除或這些操作的任何組合上執(zhí)行。MERGE操作可以觸發(fā)語句中每個操作的觸發(fā)器。

觸發(fā)器可以定義為INSTEAD OF或AFTER。AFTER觸發(fā)器發(fā)生在數(shù)據(jù)寫入表之后,是一組獨立的操作,和寫入表的操作在同一事務執(zhí)行,但在寫入發(fā)生之后執(zhí)行。如果觸發(fā)器失敗,原始操作也會失敗。INSTEAD OF觸發(fā)器替換調(diào)用的寫操作。插入、更新或刪除操作永遠不會發(fā)生,而是執(zhí)行觸發(fā)器的內(nèi)容。

觸發(fā)器允許在發(fā)生寫操作時執(zhí)行TSQL,而不管這些寫操作的來源是什么。它們通常用于在希望確保執(zhí)行寫操作時運行關鍵操作,如日志記錄、驗證或其他DML。這很方便,寫操作可以來自API、應用程序代碼、發(fā)布腳本,或者內(nèi)部流程,觸發(fā)器無論如何都會觸發(fā)。

觸發(fā)器是什么樣的

用WideWorldImporters示例數(shù)據(jù)庫中的Sales.Orders 表舉例,假設需要記錄該表上的所有更新或刪除操作,以及有關更改發(fā)生的一些細節(jié)。這個操作可以通過修改代碼來完成,但是這樣做需要對表的代碼寫入中的每個位置進行更改。通過觸發(fā)器解決這一問題,可以采取以下步驟:

1. 創(chuàng)建一個日志表來接受寫入的數(shù)據(jù)。下面的TSQL創(chuàng)建了一個簡單日志表,以及一些添加的數(shù)據(jù)點:

CREATE TABLE Sales.Orders_log
( Orders_log_ID int NOT NULL IDENTITY(1,1)
CONSTRAINT PK_Sales_Orders_log PRIMARY KEY CLUSTERED,
OrderID int NOT NULL,
CustomerID_Old int NOT NULL,
CustomerID_New int NOT NULL,
SalespersonPersonID_Old int NOT NULL,
SalespersonPersonID_New int NOT NULL,
PickedByPersonID_Old int NULL,
PickedByPersonID_New int NULL,
ContactPersonID_Old int NOT NULL,
ContactPersonID_New int NOT NULL,
BackorderOrderID_Old int NULL,
BackorderOrderID_New int NULL,
OrderDate_Old date NOT NULL,
OrderDate_New date NOT NULL,
ExpectedDeliveryDate_Old date NOT NULL,
ExpectedDeliveryDate_New date NOT NULL,
CustomerPurchaseOrderNumber_Old nvarchar(20) NULL,
CustomerPurchaseOrderNumber_New nvarchar(20) NULL,
IsUndersupplyBackordered_Old bit NOT NULL,
IsUndersupplyBackordered_New bit NOT NULL,
Comments_Old nvarchar(max) NULL,
Comments_New nvarchar(max) NULL,
DeliveryInstructions_Old nvarchar(max) NULL,
DeliveryInstructions_New nvarchar(max) NULL,
InternalComments_Old nvarchar(max) NULL,
InternalComments_New nvarchar(max) NULL,
PickingCompletedWhen_Old datetime2(7) NULL,
PickingCompletedWhen_New datetime2(7) NULL,
LastEditedBy_Old int NOT NULL,
LastEditedBy_New int NOT NULL,
LastEditedWhen_Old datetime2(7) NOT NULL,
LastEditedWhen_New datetime2(7) NOT NULL,
ActionType VARCHAR(6) NOT NULL,
ActionTime DATETIME2(3) NOT NULL,
UserName VARCHAR(128) NULL);

標簽MSSQL,SQLServer,技術(shù)文檔,數(shù)據(jù)庫,SQLSERVER

相關下載

查看所有評論+

網(wǎng)友評論

網(wǎng)友
您的評論需要經(jīng)過審核才能顯示

熱門閱覽

最新排行

公眾號

主站蜘蛛池模板: 久久亚洲欧美综合激情一区| 国产一卡二卡≡卡四卡无人区| 中文字幕乱码无码人妻系列蜜桃| 欧美精品亚洲精品日韩专区va| 国产一级毛片高清视频完整版| 57pao成人国产永久免费视频| 抽搐一进一出gif免费视频| 亚洲大香伊人蕉在人依线| 狠狠色综合色区| 成年女人男人免费视频播放| 免费观看中文字幕| 高清欧美一区二区三区| 国产高清视频在线| 中国jizzxxxx| 日韩精品一区二区三区老鸭窝| 国产成人亚洲综合在线| 999国产精品999久久久久久| 手机看片福利永久国产日韩| 亚洲人成网男女大片在线播放| 福利在线小视频| 国产精品毛片va一区二区三区| 三上悠亚中文字幕在线播放| 日韩福利片午夜在线观看| 亚洲精品国产精品国自产观看| 美团外卖猛男男同38分钟| 国产成人免费在线| 500福利视频导航| 天天爱天天干天天| 中文字幕不卡在线高清| 日韩男人的天堂| 亚洲国产精品福利片在线观看| 男女下面进入拍拍免费看| 国产无遮挡又黄又爽在线观看| 99国产欧美久久精品| 最近中文字幕在线中文视频| 亚洲精品美女视频| 精品久久久久久无码人妻| 国产一级毛片午夜| 黄色网址在线免费| 国产精品久久影院| 91亚洲国产成人精品下载|