如何使用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数据库大纲的问题,并且取代数据修改一组标准视图集。

范例

<b>Listing A</b>
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脚本向表中添加数据。

<b>Listing B</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。

<b>isting C</b>
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

时间: 2024-09-24 07:24:50

如何使用SQL Server INSTEAD-OF触发器的相关文章

sql server 2008 r2 触发器配置

问题描述 sql server 2008 r2 触发器配置 我按照书上的编写了触发器,但是总是提示语法错误. create trigger Trig_deny on 系别信息 after insert as begin raiserror('该操作不允许执行,拒绝插入信息!') end 提示:raiserror('该操作不允许执行,拒绝插入信息!') 这行 ')' 附近有语法错误. 请教各位大神怎么办啊? 解决方案 SQL Server 2008 R2镜像配置 一.准备工作 1.三台装有sql

SQL Server实现用触发器捕获DML操作的会话信息【实例】

需求背景 上周遇到了这样一个需求,维护人员发现一个表的数据经常被修改,由于历史原因:文档缺少:以及维护人员的经常变更,导致他们对系统也业务也不完全熟悉,他们也不完全清楚哪些系统和应用程序会对这个表的数据进行操作.现在他们想找出有哪些服务器,哪些应用程序会对这个表进行INSERT.UPDATE操作.那么问题来了,怎么去解决这个问题呢? 解决方案 由于数据库版本是标准版,我们选择了使用触发器来捕获进行DML操作的会话的相关信息,例如,Host_Name.Program_Name等 ,选择触发器是因为

sql server 存储过程和触发器

  一.存储过程 1.存储过程的分类 存储过程是一种数据库对象,存储在数据库内,可由应用程序通过一个调用执行,而且 允许用户声明变量.有条件执行,具有很强的编程功能 存储过程可以分为两类:系统存储过程.用户存储过程和扩展性存储过程 1).系统存储过程 系统存储过程是由SQL Server系统提供的存储过程,可以作为命令执行各种操作. 系统存储过程主要用来从系统表中获取信息,为系统管理员管理SQL Server提供帮助, 为用户查看数据库对象提供方便. 系统存储过程定义在系统数据库master中,

MySQL、SQL Server 和 Oracle 触发器的创建

场景:当 users 表在 insert,update,delete 时,在 users_log 表中记录变更的 id MySQL触发器的创建 触发时机:BEFORE,AFTER 触发事件:INSERT,UPDATE,DELETE NEW 和 OLD 关键字: | action | NEW | OLD | |--------|----------------|----------------| | insert | 插入的新数据 | 无 | | update | 修改为的新数据 | 被修改的原数

SQL Server如何用触发器捕获DML操作的会话信息

需求背景        上周遇到了这样一个需求,维护人员发现一个表的数据经常被修改,由于历史原因:文档缺少:以及维护人员的经常变更,导致他们对系统也业务也不完全熟悉,他们也不完全清楚哪些系统和应用程序会对这个表的数据进行操作.现在他们想找出有哪些服务器,哪些应用程序会对这个表进行INSERT.UPDATE操作.那么问题来了,怎么去解决这个问题呢?   解决方案 由于数据库版本是标准版,我们选择了使用触发器来捕获进行DML操作的会话的相关信息,例如,Host_Name.Program_Name等

SQL SERVER中各类触发器的完整语法及参数说明

语法: Trigger on an INSERT, UPDATE, or DELETE statement to a table or view (DML Trigger) CREATE TRIGGER [ schema_name . ]trigger_name ON { table | view } [ WITH <dml_trigger_option> [ ,...n ] ] { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE

SQL SERVER中各类触发器的完整语法及参数说明_MsSql

语法: Trigger on an INSERT, UPDATE, or DELETE statement to a table or view (DML Trigger) CREATE TRIGGER [ schema_name . ]trigger_name ON { table | view } [ WITH <dml_trigger_option> [ ,...n ] ] { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE

如何使用SQL Server 2005 INSTEAD-OF触发器

触发器是类似于存储程序的数据库对象,它响应数据库环境下的某个请求.SQL Sever 2005包含3个触发器对象:AFTER,数据定义语言 (DDL)和INSTEAD-OF. AFTER触发器是存储程序,它发生于数据操作语句作用之后,例如删除语句等.DDL是SQL Server 2005的新触发器,允许响应数据库引擎中对象定义水平事件(例如:DROP TABLE语句).INSTEAD-OF触发器是对象,在数据库引擎中可以取代数据操作语句而执行.例如:将INSTEAD-OF INSERT触发器附加

SQL SERVER使用嵌套触发器

server|触发器 如果一个触发器在执行操作时引发了另一个触发器,而这个触发器又接着引发下一个触发器--这些触发器就是嵌套触发器.触发器可嵌套至 32 层,并且可以控制是否可以通过"嵌套触发器"服务器配置选项进行触发器嵌套. 如果允许使用嵌套触发器,且链中的一个触发器开始一个无限循环,则超出嵌套级,而且触发器将终止. 可使用嵌套触发器执行一些有用的日常工作,如保存前一触发器所影响行的一个备份.例如,可以在 titleauthor 上创建一个触发器,以保存由 delcascadetri

讲解SQL Server数据库的触发器的安全隐患

触发器权限和所有权 CREATE TRIGGER 权限默认授予定义触发器的表所有者.sysadmin 固定服务器角色成员以及 db_owner 和 db_ddladmin 固定数据库角色成员,并且不可转让. 需要的环境 本文需要的环境是已经获取了sql服务器的以上其中一个权限,目的是为了留下隐蔽的后门,不被管理员发现.即使发现了也是加密的(可以破解,不过有些管理员不懂,也不会注意,相关信息google下). 触发器是在对表进行插入(insert).更新(update)或删除(delete)操作时