程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> 其他數據庫知識 >> MSSQL >> SQL Server 2000中的觸發器應用

SQL Server 2000中的觸發器應用

編輯:MSSQL

SQL Server 2000中的觸發器應用。本站提示廣大學習愛好者:(SQL Server 2000中的觸發器應用)文章只能為提供參考,不一定能成為您想要的結果。以下是SQL Server 2000中的觸發器應用正文


上面我摘錄了SQL Server官方教程中的一段關於觸發器的文字,確切有效的一點文字描寫。
  可以界說一個不管什麼時候用INSERT語句向表中拔出數據時都邑履行的觸發器。
  當觸發INSERT觸發器時,新的數據行就會被拔出到觸發器表和inserted表中。inserted表是一個邏輯表,它包括了曾經拔出的數據行的一個正本。inserted表包括了INSERT語句中已記載的拔出舉措。inserted表還許可援用由初始化INSERT語句而發生的日記數據。觸發器經由過程檢討inserted表來肯定能否履行觸發器舉措或若何履行它。inserted表中的行老是觸發器表中一行或多行的正本。
  日記記載了一切修正數據的舉措(INSERT、UPDATE和DELETE語句),但在事務日記中的信息是弗成讀的。但是,inserted表許可你援用由INSERT語句惹起的日記變更,如許便可以將拔出數據與產生的變更停止比擬,來驗證它們或采用進一步的舉措。也能夠直接援用拔出的數據,而不用將它們存儲到變量中。
  示例
  在本例中,將創立一個觸發器。不管什麼時候訂購產物(不管什麼時候向Order Details表中拔出一筆記錄),這個觸發器都將更新Products表中的一列(UnitsInStock)。用本來的值減去訂購的數目值即為新值。

USE Northwind
CREATE TRIGGER OrdDet_Insert
ON [Order Details]
FOR INSERT
AS
UPDATE P SET
UnitsInStock = P.UnitsInStock – I.Quantity
FROM Products AS P INNER JOIN Inserted AS I
ON P.ProductID = I.ProductID

  DELETE觸發器的任務進程
  當觸發DELETE觸發器後,從受影響的表中刪除的即將被放置到一個特別的deleted表中。deleted表是一個邏輯表,它保存已被刪除數據行的一個正本。deleted表還許可援用由初始化DELETE語句發生的日記數據。
  應用DELETE觸發器時,須要斟酌以下的事項和准繩:
  ·當某行被添加到deleted表中時,它就不再存在於數據庫表中;是以,deleted表和數據庫表沒有雷同的行。
  ·創立deleted表時,空間是從內存平分配的。deleted表老是被存儲在高速緩存中。
  ·為DELETE舉措界說的觸發器其實不履行TRUNCATE TABLE語句,緣由在於日記不記載TRUNCATE TABLE語句。
  示例
  在本例中,將創立一個觸發器,不管什麼時候刪除一個產物種別(即從Categories表中刪除一筆記錄),該觸發器都邑更新Products表中的Discontinued列。一切受影響的產物都標志為1,標示不再應用這些產物了。

USE Northwind
CREATE TRIGGER Category_Delete
ON Categories
FOR DELETE
AS
UPDATE P SET Discontinued = 1
FROM Products AS P INNER JOIN deleted AS d
ON P.CategoryID = d.CategoryID

  UPDATE觸發器的任務進程
  可將UPDATE語句算作兩步操作:即捕捉數據前像(before image)的DELETE語句,和捕捉數據後像(after image)的INSERT語句。當在界說有觸發器的表上履行UPDATE語句時,原始行(前像)被移入到deleted表,更新行(後像)被移入到inserted表。
  觸發器檢討deleted表和inserted表和被更新的表,來肯定能否更新了多行和若何履行觸發器舉措。
  可使用IF UPDATE語句界說一個監督指定列的數據更新的觸發器。如許,便可以讓觸發器輕易的隔離出特定列的運動。當它檢測到指定列曾經更新時,觸發器就會進一步履行恰當的舉措,例如收回毛病信息指出該列不克不及更新,或許依據新的更新的列值履行一系列的舉措語句。
  語法
IF UPDATE (<column_name>)
  例1
  本例阻攔用戶修正Employees表中的EmployeeID列。

USE Northwind
GO
CREATE TRIGGER Employee_Update
ON Employees
FOR UPDATE
AS
IF UPDATE (EmployeeID)
BEGIN
RAISERROR ('Transaction cannot be processed.\
***** Employee ID number cannot be modified.', 10, 1)
ROLLBACK TRANSACTION
END

  INSTEAD OF觸發器的任務進程
  可以在表或視圖上指定INSTEAD OF觸發器。履行這類觸發器就可以夠替換原始的觸動員作。INSTEAD OF觸發器擴大了視圖更新的類型。關於每種觸動員作(INSERT、UPDATE或 DELETE),每個表或視圖只能有一個INSTEAD OF觸發器。
  INSTEAD OF觸發器被用於更新那些沒有方法經由過程正常方法更新的視圖。例如,平日不克不及在一個基於銜接的視圖長進行DELETE操作。但是,可以編寫一個INSTEAD OF DELETE觸發器來完成刪除。上述觸發器可以拜訪那些假如視圖是一個真實的表時曾經被刪除的數據行。將被刪除的行存儲在一個名為deleted的任務表中,就像AFTER觸發器一樣。類似地,在UPDATE INSTEAD OF觸發器或許INSERT INSTEAD OF觸發器中,你可以拜訪inserted表中的新行。
  不克不及在帶有WITH CHECK OPTION界說的視圖中創立INSTEAD OF觸發器。
示例
  在本例中,創立了一個德國客戶表和一個墨西哥客戶表。放置在視圖上的INSTEAD OF觸發器將把更新操作從新定向到恰當的基表上。這時候產生的拔出是對CustomersGer表的拔出而不是對視圖的拔出。
  創立兩個包括客戶數據的表:

SELECT * INTO CustomersGer FROM Customers WHERE Customers.Country = 'Germany'
SELECT * INTO CustomersMex FROM Customers WHERE Customers.Country = 'Mexico'
GO

  在該數據上創立視圖:

CREATE VIEW CustomersView AS
SELECT * FROM CustomersGer
UNION
SELECT * FROM CustomersMex
GO

  創立一個在上述視圖上的INSTEAD OF觸發器:

CREATE TRIGGER Customers_Update2
ON CustomersView
INSTEAD OF UPDATE AS
DECLARE @Country nvarchar(15)
SET @Country = (SELECT Country FROM Inserted)
IF @Country = 'Germany'
BEGIN
UPDATE CustomersGer
SET CustomersGer.Phone = Inserted.Phone
FROM CustomersGer JOIN Inserted
ON CustomersGer.CustomerID = Inserted.CustomerID
END
ELSE
IF @Country = 'Mexico'
BEGIN
UPDATE CustomersMex
SET CustomersMex.Phone = Inserted.Phone
FROM CustomersMex JOIN Inserted
ON CustomersMex.CustomerID = Inserted.CustomerID
END

  經由過程更新視圖,測試觸發器:

UPDATE CustomersView SET Phone = ' 030-007xxxx'
WHERE CustomerID = 'ALFKI'
SELECT CustomerID, Phone FROM CustomersView
WHERE CustomerID = 'ALFKI'
SELECT CustomerID, Phone FROM CustomersGer
WHERE CustomerID = 'ALFKI'

  那末詳細的講,關於多列數據,若何盤算方差呢?:

CREATE TRIGGER [calT1T2T3] ON dbo.DCLB
FOR INSERT,UPDATE
AS
update P
SET
/**//*
盤算方差的觸發器
*/
P.T1=(I.P1+I.P2+I.P3+I.P4+I.P5+I.P6),
P.T2=(I.Y1+I.Y2+I.Y3+I.Y4+I.Y5+I.Y6 ),
P.T3=SQRT(P.T1*P.T1+P.T2*P.T2)
FROM DCLB AS P INNER JOIN Inserted AS I
ON P.SID = I.SID

  觸發器的應用很便利,並且也很簡略,主要的是懂得inserted進程。可將UPDATE語句算作兩步操作:即捕捉數據前像(before image)的DELETE語句,和捕捉數據後像(after image)的INSERT語句。當在界說有觸發器的表上履行UPDATE語句時,原始行(前像)被移入到deleted表,更新行(後像)被移入到inserted表。觸發器檢討deleted表和inserted表和被更新的表,來肯定能否更新了多行和若何履行觸發器舉措。
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved