当前位置:七道奇文章资讯数据防范MSSQL防范
日期:2011-05-02 15:20:00  来源:本站整理

SQL Server 2000中的触发器利用[MSSQL防范]

赞助商链接



  本文“SQL Server 2000中的触发器利用[MSSQL防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
触发器是数据库利用中的重用工具,它的利用很遍及.这几天写一个化学数据统计方面的软件,需求按照采样,自动计算方差,在这里,我利用了触发器.

  下面我摘录了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触发器.

[1] [2] 下一页  


示例

  在本例中,成立了一个德国客户表和一个墨西哥客户表.安排在视图上的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] 

  以上是“SQL Server 2000中的触发器利用[MSSQL防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • Windows 搭配 IIS7 PHP MySQL 环境
  • sqlserver索引的原理及索引成立的注意事项小结
  • SQL Join的一些总结(实例)
  • SQL的Join利用图解教程
  • SQL中JOIN和UNION辨别、用法及示例介绍
  • 关于SQL中CTE(公用表表达式)(Common Table Expression)的总结
  • mysql Out of memory (Needed 16777224 bytes)的错误办理
  • mysql提醒[Warning] Invalid (old?) table or database name问题的办理办法
  • mysql启用skip-name-resolve情势时呈现Warning的处理办法
  • mysql启用skip-name-resolve情势时呈现Warning的处理办法
  • MySQL Order By语法介绍
  • <b>MySQL ORDER BY 的实现解析</b>
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .