1. 程式人生 > >如何使用SQL Server INSTEAD-OF觸發器

如何使用SQL Server INSTEAD-OF觸發器


觸發器是類似於儲存程式的資料庫物件,它響應資料庫環境下的某個請求。SQL Sever 2005包含3個觸發器物件:AFTER,資料定義語言 (DDL)和INSTEAD-OF。

AFTER觸發器是儲存程式,它發生於資料操作語句作用之後,例如刪除語句等。DDL是SQL Server 2005的新觸發器,允許響應資料庫引擎中物件定義水平事件(例如:DROP TABLE語句)。INSTEAD-OF觸發器是物件,在資料庫引擎中可以取代資料操作語句而執行。例如:將INSTEAD-OF INSERT觸發器附加到表,告訴資料庫執行此觸發器。

使用INSTEAD-OF觸發器的理由

INSTEAD-OF觸發器是SQL Sever功能強大的物件,允許開發人員轉移資料庫引擎完成不同的工作,以滿足開發要求。其中的一個例子是在資料庫的表中新增INSTEAD-OF觸發器,當不需要修改表時,可以對錶的內容進行回滾。使用此方法時,必須格外小心,因為任何指定的表修改之前,INSTEAD-OF觸發器必須處於啟用狀態。

使用INSTEAD-OF觸發器一個更充分理由是檢視處理。在檢視中新增INSTEAD-OF觸發器後,則可建立更新的檢視。可更新檢視允許完整地提取資料庫大綱,因此可以用此方法設計系統,而不需要擔心OLTP資料庫大綱的問題,並且取代資料修改一組標準檢視集。

範例

Listing A 
CREATE TABLE Products
(
      ProductID SMALLINT IDENTITY(1,1) PRIMARY KEY,
      Description VARCHAR(75),
      Price MONEY NOT NULL
)
GO
CREATE TABLE Purchases
(
      PurchaseID SMALLINT IDENTITY(1,1) PRIMARY KEY,
      ProductID SMALLINT REFERENCES Products(ProductID),
      PurchasePrice MONEY NOT NULL, 
      PurchaseDate SMALLDATETIME DEFAULT(GETDATE())
)

  為了更好地說明可更新檢視概念,我們提供一個示例。在本例中,我們設計一個產品表(記錄產品),一個購買表(記錄購買)。Listing A包含了建立表的指令碼,執行此指令碼後則得到示例中所要用到的表。執行Listing B指令碼向表中新增資料。

Listing B
INSERT INTO Products(Description, Price) VALUES('Television',500)
INSERT INTO Products(Description, Price) VALUES('VCR',100)
INSERT INTO Products(Description, Price) VALUES('DVD_Player',125)
INSERT INTO Products(Description, Price) VALUES('Alarm_Clock',40)
INSERT INTO Products(Description, Price) VALUES('Camera',325)
INSERT INTO Products(Description, Price) VALUES('Projector',1500)
INSERT INTO Products(Description, Price) VALUES('XBox',400)
GO
INSERT INTO Purchases(ProductID, PurchasePrice) VALUES(1, 500)
INSERT INTO Purchases(ProductID, PurchasePrice) VALUES(5, 325)
INSERT INTO Purchases(ProductID, PurchasePrice) VALUES(1, 525)
GO

現在表中已經有資料了,我可以為這些表建立一些有意義的檢視。請檢視Listing C。

isting C
CREATE VIEW vw_ProductPurchases
AS
      SELECT
            pr.ProductID, 
            pr.Description, 
            pr.Price AS ProductPrice, 
            pu.PurchasePrice, 
            pu.PurchaseDate   
      FROM
            Products pr
            INNER JOIN Purchases pu ON pr.ProductID = pu.ProductID
GO

  這是個典型的產品水平的檢視。它聯合了資料庫中的兩個表,使得資料簡單化了。但是,對於資料提取,使用檢視則沒有什麼優勢。在檢視上附上INSTEAD-OF觸發器後,則允許修改表,但是我不需要直接修改表中的資料。我使用Listing D中的程式碼在vw_ProductPurchases檢視上建立一個INSTEAD-OF觸發器。

Listing D
CREATE TRIGGER tr_vwProductPurchases ON vw_ProductPurchases
INSTEAD OF INSERT
AS
BEGIN
      IF EXISTS
      (
            SELECT TOP 1 *
            FROM INSERTED
            WHERE 
                  ProductID IS NOT NULL AND
                  ISNULL(COALESCE(PurchasePrice, ProductPrice),0)>0
      )
      BEGIN
            INSERT INTO Purchases
            (
                  ProductID, PurchasePrice, PurchaseDate
            )
            SELECT
i.ProductID, COALESCE(PurchasePrice, ProductPrice), ISNULL(PurchaseDate, GETDATE())
            FROM INSERTED i   
      END
      ELSE
      BEGIN
            PRINT 'Adequate data not provided.'
      END
END

請注意此INSTEAD OF觸發器的宣告。SQL Server建立的預設的觸發器為AFTER觸發器,因此,必須在觸發器定義中指定INSTEAD OF子句。

觸發器的第一條語句是“check”語句。本例中我使用此語句檢測INSERTED表以確保顯示ProductID欄位,並且保證提供顯示其他PurchasePrice 或 ProductPrice欄位。

如果必要的資料通過INSERT語句都插入到檢視中,則觸發器將插入指定的值到資料表。下面即是檢視的INSERT語句。 INSERT INTO vw_ProductPurchases(ProductID, PurchasePrice) VALUES(1, 700)

INSERT語句提供了有效的ProductID和PurchasePrice,這意味著新記錄插入到Purchases表。

結論

INSTEAD-OF觸發器具有強大的功能和靈活性。如果系統不大,使用檢視系統提取資料大綱能夠極大保護資料庫程式。

上面的例子很簡單,系統中所用到的複雜的觸發器需要考慮安全性問題、時間開銷和其他限制。

相關推薦

如何使用SQL Server INSTEAD-OF觸發器

觸發器是類似於儲存程式的資料庫物件,它響應資料庫環境下的某個請求。SQL Sever 2005包含3個觸發器物件:AFTER,資料定義語言 (DDL)和INSTEAD-OF。 AFTER觸發器是儲存程式,它發生於資料操作語句作用之後,例如刪除語句等。DDL是SQL Server 2005的新觸發器,允許響

PL/SQL --> INSTEAD OF 觸發器

--============================== -- PL/SQL --> INSTEAD OF 觸發器 --============================== IN

SQL Server如何用觸發器捕獲DML操作的會話信息

align bottom date name har 2-2 一次 ogr 一個 原文:SQL Server如何用觸發器捕獲DML操作的會話信息需求背景 上周遇到了這樣一個需求,維護人員發現一個表的數據經常被修改,由於歷史原因;文檔缺少;以及維護人員的經常變

SQL Server資料庫級別觸發器

禁止修改表結構和加表  CREATE TRIGGER [Object_Change_Trigger_DDL] ON DATABASE FOR ALTER_TABLE,DROP_TABLE,CREATE_TABLE,CREATE_INDEX,ALTER_INDEX

SQL server 2008建立觸發器例項

觸發器定義以及分類: 觸發器是一種特殊型別的儲存過程,它不同於之前的我們介紹的儲存過程。觸發器主要是通過事件進行觸發被自動呼叫執行的。而儲存過程可以通過儲存過程的名稱被呼叫。 Ø 什麼是觸發器     觸發器對錶進行插入、更新、刪除的時候會自動執行的特殊儲存過程。觸發器一般

SQL Server Audit監控觸發器狀態

一.本文所涉及的內容(Contents) 二.背景(Contexts)   DML觸發器一般會運用在業務系統的邏輯處理上,在你對資料庫使用者許可權控制不當的時候,這些DML觸發器很可能莫名的被禁用或者刪除了,你作為資料庫管理員你想做冤大頭嘛?背黑鍋嘛?如果不想,下面給出4種解決方案: 1. 使用DD

SQL Server中,觸發器詳解

觸發器是一種特殊型別的儲存過程,它不同於之前的我們介紹的儲存過程。觸發器主要是通過事件進行觸發被自動呼叫執行的。而儲存過程可以通過儲存過程的名稱被呼叫。 Ø 什麼是觸發器     觸發器對錶進行插入、更新、刪除的時候會自動執行的特殊儲存過程。觸發器一般用在check約束更加複雜的約束上面。觸發器和普通的儲存

Sql Server】使用觸發器把一個表中滿足條件的資料部分欄位插入到另一個表中

create trigger 觸發器名稱 on 對哪個表起作用 after insert,update as if @@rowcount =0 return set nocount on begin transaction; insert into 表名 (col1,co

觸發器(六、instead of觸發器實現檢視增刪改)

場景描述 開發中遇到一個情況:前臺頁面是一個角色對使用者的批量授權,其中使用者是多選,多選的結果是控制元件裡會填入逗號分隔的使用者ID字串,比如“TOM,JERRY”,最終要分別插入2張一對多的主從表中。 --主表 CREATE TABLE T_MAIN (

SQL Server 2005/2008 觸發器的管理和檢視

 1、通過視覺化操作來管理和檢視觸發器 在Microsoft SQL Server Management Studio中,選中某一資料庫的某一張表時,在“物件資源管理器詳細”視窗中有“觸發器”項。通過“觸發器”的右鍵選單功能,我們可以新建觸發器。如果原來的表中已經存在了觸發器

Sql server 使用全域性觸發器限制IP 實現白名單功能

首先新建一個表:WhiteList 欄位 :IP 然後手動插入一條記錄: insert into 資料庫名.dbo.WhiteList(IP) values('<local machine>')   --切記一定要加,否則等下觸發器建立後就無法進來了(解決方案在

初學sql server 2008之觸發器

  觸發器(trigger):是一種特殊的儲存過程,可以用來對錶實施複雜的完整性約束,保持資料的一致性。當觸發器所保護的資料發生改變時,觸發器會自動被啟用,並執行觸發器中所定義的相關操作,從而保證對資料的不完整性約束或不正確的修改。   在SQL SERVER 2008中,有三種類型的觸發器: (1)DML

Sql Server資料庫使用觸發器和sqlbulkcopy大批量資料插入更新

需要了解的知識 1.觸發器 2.sqlbulkcopy 我的用途 開發資料庫同步的工具,需要大批量資料插入和資料更新。 方式 使用SqlBulkCopy類對資料進行資料批量複製,將需要同步資料的表新建一個結構相同的臨時表。然後在臨時表編寫觸發器用於對更新資料的表進行資料插入

SQL server查看觸發器是否被禁用

錯誤 lec type sql bject lse sel sele ase 1 select a.name as 觸發器名,b.name as 表名, 2 case a.is_disabled when 0 then ‘啟用‘ when 1 then ‘禁用‘ el

SQL觸發器】型別 FOR 、AFTER、 Instead of到底是什麼鬼

前言: 上一篇部落格講述了觸發器的基本概念,觸發器什麼時候用,為什麼用!這篇部落格將簡述觸發器的型別,由於FOR觸發器與AFTER觸發器是一個作用,所以觸發器分為AFTER觸發器,與Instead of 觸發器! 為了讓大家明白觸發器,我先把我的資料庫是幹嘛的給

SQL server觸發器、存儲過程操作遠程數據庫插入數據,解決服務器已存在的問題

定義 ims val rom 記錄 插入記錄 其它 pre 項目 近期弄了一個小項目,也不是非常復雜,須要將一個數據庫的一些數據備份到另外一個庫。不是本地,可能是網絡上其它的數據庫。想了一下,用了存儲過程和觸發器。也不是非常復雜,首先我須要操作遠程數據庫,於是寫了一個存

【2018-01-19】Sql Server-觸發器

1-1 觸發器 eight sco 不能 val ted 直接 ins 1 --create table users--創建用戶表 2 --( 3 -- ids int primary key identity(1,1), 4 -- name nvar

遍歷SQL SERVER中所有存儲過程和觸發器

server text 查找 所有 and from obj where serve 如果需要查找某個存儲過程或觸發器中是否含有某段文本(比如:你想知道有哪些存儲過程操作了某個表) 可以這麽寫 select name from sysobjects o, syscomm

SQL Server DDL觸發器

用戶名 eat exists lar value back ref tro get DDL 觸發器作用: DDL 觸發器主要用於防止對數據庫架構、視圖、表、存儲過程等進行的某些修改。 DDL 觸發器事件: DDL 觸發器在創建用來監視並響應該數據庫或服務器實例中的活動的

淺入淺出SQL Server 觸發器

什麼是觸發器 簡單的來說,在SQL Server裡面也就是對某一個表的一定的操作,觸發某種條件,從而執行的一段程式。觸發器是一個特殊的儲存過程。 觸發器的建立 常見的觸發器有三種,分別對應於Insert 、Update、Delete事件。 怎麼建立觸發器呢?在牛腩新聞釋出系統