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

          軟件下載吧

          當前位置:軟件下載吧 > 數據庫 > MS_SQL > SQL開發知識:關于SQL Server數據庫觸發器詳解

          SQL開發知識:關于SQL Server數據庫觸發器詳解

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

          前言

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

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

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

          什么是觸發器

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

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

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

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

          觸發器是什么樣的

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

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

          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,技術文檔,數據庫,SQLSERVER

          相關下載

          查看所有評論+

          網友評論

          網友
          您的評論需要經過審核才能顯示

          熱門閱覽

          最新排行

          公眾號

          主站蜘蛛池模板: 亚洲视频在线观看一区| 97精品一区二区视频在线观看| 国产av一区二区三区日韩| 亚洲一区二区精品视频| 高清一区二区三区日本久| 无码精品国产一区二区三区免费 | 一区二区三区日本视频| 国产在线aaa片一区二区99| 亚洲A∨无码一区二区三区| 无码人妻精品一区二区蜜桃网站 | 精品国产一区二区三区在线观看 | 精品人妻码一区二区三区 | 亚洲性日韩精品国产一区二区| 香蕉在线精品一区二区| 乱色精品无码一区二区国产盗| 亚洲欧美日韩中文字幕一区二区三区 | а天堂中文最新一区二区三区| 国产精品熟女一区二区| 亚洲av无码一区二区三区四区| 日本免费精品一区二区三区| 国产精品毛片一区二区三区 | 国产AⅤ精品一区二区三区久久| 99精品国产高清一区二区三区| 91视频一区二区三区| 午夜精品一区二区三区在线观看| 中文字幕一区二区人妻性色| 无码国产精品久久一区免费| 国产在线精品一区二区高清不卡| 亚洲一区电影在线观看| 亚洲国产成人久久一区久久| 亚洲国产欧美国产综合一区| 波多野结衣高清一区二区三区| 无码人妻一区二区三区免费| 亚洲综合色自拍一区| 精品一区二区久久久久久久网精| 久久亚洲一区二区| 日韩精品人妻av一区二区三区| 亚洲一区欧洲一区| 日韩人妻无码一区二区三区| 日本美女一区二区三区| 久久精品免费一区二区喷潮|