`

轻松掌握设计 Sql Server触发器的原理

阅读更多

1、触发器的 '本质':

 

触发器是一种特殊的存储过程,它不能被显式地调用,

而是在往表中插入记录、更改记录或者删除记录时,当事件发生时,才被

自动地激活。

 

2、这样做带来的 '功能':

 

触发器可以用来对表实施复杂的完整性约束,保持数

据的一致性,当触发器所保护的数据发生改变时,触发器会自动被激活,

响应同时执行一定的操作(对其它相关表的操作),从而保证对数据的不完整

性约束或不正确的修改。

 

触发器可以查询其它表,同时也可以执行复杂的T-SQL语句。触发器和引

发触发器执行的命令被当作一次事务处理,因此就具备了事务的所有特征。

 

注意: '事务具备什么特征?在触发器中的作用?'

如果发现引起触发器执行的T-SQL语句执行了一个非法操作,比如关于其它表的

相关性操作,发现数据丢失或需调用的数据不存在,那么就回滚到该事件执行

前的SQL SERVER数据库状态。

 

3、触发器的作用:

 

触发器可以对数据库进行级联修改,这一点刚才已经说过了。

 

需要说明的是: '触发器和约束的关系和区别'

 

(1)一般来说,使用约束比使用触发器效率更高。

 

(2)同时,触发器可以完成比CHECK约束更复杂的限制。

说明:

2.1 与CHECK约束不同,在触发器中可以引用其它的表。

2.2 触发器可以发现改变前后表中数据的不一致,并根据这些不同来进行相应

的操作。

2.3 对于一个表不同的操作(INSERT、UPDATE、DELETE)可以采用不同的触

发器,即使是对相同的语句也可以调用不同的触发器来完成不同的操作。

 

举例1:在签订一份订单时,货物的库存量应减少。

问?这应用了触发器的什么特征?CHECK约束能解决吗?

 

举例2:正在进行整理的货物不能下订单。

问?这应用了触发器的什么特征?CHECK约束能解决吗?

 

 

4、对触发器3种操作的分析:

在SQL SERVER为每个触发器都创建了两个专用表:inserted表和deleted表。

这是两个逻辑表,由系统来维护,在触发执行时存在,在触发结束时消失。

 

这样有什么用途?

 

带着问题看,具体操作步骤和过程:

 

(1)deleted表存放由于执行delete或update语句而要从表中删除的所有行。

在执行delete或update操作时,被删除的行从激活触发器的表中被移动(move)到deleted

表,这两个表不会有共同的行。

 

(2)inserted表存放由于执行insert或update语句而要向表中插入的所有行。

在执行insert或update事物时,新的行同时添加到激活触发器的表中和inserted表中,

inserted表的内容是激活触发器的表中新行的拷贝。

 

说明:update事务可以看作是先执行一个delete操作,再执行一个insert操作,旧的行首先

被移动到deleted表,让后新行同时添加到激活触发器的表中和inserted表中。

 

11.1.3 instead of 和 after 触发器

主要包括定义和应用范围条件,操作执行时机;

 

11.2 创建触发器

1、考虑为什么要设计出发器,为解决什么问题而设计?

 

2、应制定的内容:为什么,大家思考一下?不知道,看下面的例子,全看完!

 

T-SQL语句创建触发器

语法结构:

 

create trigger 触发器名 
on 表或视图
for|after|instead of --操作时机
insert,update,delete
as
sql语句

 

 

 

作业:

(要求:在northwind表中建立2个表:cust_test和order_test)

 

cust_test: CustomerID char(5) PK  order_test:
CustomerID char(5)--对应关系
Custcity                           Orderid    PK
Custname                           OrderNames
CStatus    int                     OStatus    int --状态
Cstorage   int                     Orders     int --定购量和库存量
Cdate      date                    Odate      date--日期

 

作业1:

在cust_test表中建立删除触发器,实现上述2表的级联删除。

 

 

 

作业2:

在order_test表建立insert触发器,当向order_test表插入一行,如果cust_test表中对应

记录status值为1,说明处于准备状态不能写入该数据。

 

答案1:
use northwind
go
create trigger cust_orders_del1
on Cust_test
after delete
as 
delete from order_test
where CustomerID in
(select CustomerID from deleted)
go

答案2:
use northwind
go
create trigger cust_orders_ins2
on order_test
after insert
as
if (select cstatus from cust_test,inserted where 

cust_test.customerid=inserted.customerid)=1
begin
print 'The Goods is being processed'
rollback transaction
end
go

 

 

 

图形化操作触发器

 

11.3 查看触发器情况

 

图形化操作结合T-SQL命令

 

(1)sp_helptrigger 触发器名

 

查看触发器的名称,拥有者和五个布尔值

 

supdate,isdelete,isinsert,isafter,isinsteadof

 

 

(2)sp_helptext 触发器名

 

查看文本信息

 

(3)设置某一触发器的无效和重新有效

 

无效:
use northwind
alter table 表名
disable trigger 触发器名

重新有效:
use northwind
alter table 表名
enable trigger 触发器名

 

 

 

 

 

(4)删除触发器

 

use northwind
drop trigger 触发器名,触发器名

 

 

 

作业3:

在order_test表上建立一个插入触发器,在添加一个订单时,减少cust_test表的相应货物的记录的库存量。

 

作业4:

在order_test表上建立一个插入触发器,规定订单日期(Odate)不能手工修改。

 

 

作业5:

要求订购的物品一定要在仓库中有的,并且数量足够。

 

 

 

例6:

在order_test表上建立一个插入触发器,同时插入多行数据时,要求订购的物品一定要在仓库中有的。

 

答案3:

 

use northwind
go 
create trigger cust_orders_ins3
on order_test
after insert
as 
update cust_test set cstorage=cstorage-inserted.orders
from cust_test,inserted
where cust_test.customerid=inserted.customerid

 

 

答案4:

 

use northwind
go
create trigger orderdateupdate
on order_test
after update
as
if update (odate)
begin
raiserror('Error',10,1)
rollback transaction
end

 

 

答案5:

 

use northwind
go
create trigger order_insert5
on order_test
after insert
as
begin
if(select count(*)
from cust_test,inserted
where cust_test.customerid=inserted.customerid)=0
begin
print 'No entry in goods for your order'
rollback transaction
end
if(select cust_test.cstorage from cust_test,inserted 
where cust_test.customerid=inserted.customerid)<
(select inserted.orders from cust_test,inserted 
where cust_test.customerid=inserted.customerid)
begin
print 'No enough entry in goods for your order'
rollback transaction
end
end

 

 

 

 

答案6:

 

use northwind
go
create trigger order_insert6
on order_test
after insert
as
if 
(select count(*) from cust_test,inserted
where cust_test.customerid=inserted.customerid)<>@@rowcount
--可以在触发器逻辑中使用 @@ROWCOUNT 函数以区分单行插入和多行插入。
begin
delete order_test from order_test,inserted
where order_test.orderid=inserted.orderid and
inserted.customerid not in (select customerid from cust_test)
end

print @@rowcount

 

 

Transact-SQL 参考

 

SET ROWCOUNT

使 Microsoft? SQL Server? 在返回指定的行数之后停止处理查询。

 

语法

 

SET ROWCOUNT { number | @number_var }

 

 

参数

 

number | @number_var

 

 

是在停止给定查询之前要处理的行数(整数)。

 

注释

建议将当前使用 SET ROWCOUNT 的 DELETE、INSERT 和 UPDATE 语句重新编写为使用 TOP 语法。有关更多信息,请参见 DELETE、INSERT 或 UPDATE。

对于在远程表和本地及远程分区视图上执行的 INSERT、UPDATE 和 DELETE 语句,忽略 SET ROWCOUNT 选项设置。

若要关闭该选项(以便返回所有的行),请将 SET ROWCOUNT 指定为 0。

说明 设置 SET ROWCOUNT 选项将使大多数 Transact-SQL 语句在已受指定数目的行影响后停止处理。这包括触发器和 INSERT、UPDATE 及 DELETE 等数据修改语句。ROWCOUNT 选项对动态游标无效,但限制键集的行集和不感知游标。使用该选项时应谨慎,它主要与 SELECT 语句一起使用。

 

 

如果行数的值较小,则 SET ROWCOUNT 替代 SELECT 语句 TOP 关键字。

 

SET ROWCOUNT 的设置是在执行或运行时设置,而不是在分析时设置。

 

权限

SET ROWCOUNT 权限默认授予所有用户。

 

示例

SET ROWCOUNT 在指定的行数后停止处理。在下例中,注意有 x 行满足预付款少于或等于 $5,000 的条件;但是,从更新所返回的行数中可以看出并非所有的行都得到处理。ROWCOUNT 影响所有的 Transact-SQL 语句。

 

USE pubs
GO
SELECT count(*) AS Cnt
FROM titles 
WHERE advance >= 5000
GO

 

 

 

下面是结果集:

 

Cnt       
----------- 
11          

(1 row(s) affected)

现在,将 ROWCOUNT 设置为 4,并更新预付款等于或大于 $5,000 的所有行。
SET ROWCOUNT to 4.
SET ROWCOUNT 4
GO
UPDATE titles
SET advance = 5000
WHERE advance >= 5000
GO

 

分享到:
评论

相关推荐

    轻松掌握设计Sql Server触发器的原理

    Sql Server中的触发器是数据库设计中的一个重要组成部分,它是一种特殊类型的存储过程,其核心特性在于它们不是通过直接调用执行,而是与数据操作语言(DML)如INSERT、UPDATE、DELETE紧密关联。当这些操作发生时,...

    sql server 应用与开发教程

    本教程旨在帮助初学者掌握SQL Server的基本概念、操作和开发技巧,使其能够轻松入门。 一、SQL Server基础 1. 数据库管理:SQL Server提供了一整套数据库创建、修改和删除的工具,包括Transact-SQL(T-SQL)语句和...

    轻松搞定SQL Server 2000程序设计

    本文将深入探讨如何轻松掌握SQL Server 2000的程序设计,包括其核心概念、安装与配置、数据管理、查询优化以及安全性控制。 一、SQL Server 2000核心概念 SQL Server 2000的核心组件包括数据库引擎、Analysis ...

    轻松搞定 sql server 2000 程序设计

    《轻松搞定 SQL Server 2000 程序设计》是一本专为初学者和有一定基础的数据库管理员设计的指南,旨在帮助读者快速掌握 SQL Server 2000 的核心概念、操作与编程技巧。SQL Server 2000 是微软公司推出的一款功能强大...

    轻松掌握SQL (第四版)

    综上所述,《轻松掌握SQL (第四版)》是一本非常适合初学者和有一定经验的开发者学习SQL Server 2000 的书籍。通过详细的案例和实践指南,读者可以逐步掌握从安装配置到高级功能使用的全过程,从而成为一名合格的...

    轻松搞定 SQL Server 2000 程序设计

    这本书旨在帮助读者理解和掌握SQL Server 2000的核心功能和高级特性,以便于进行高效的数据管理和应用程序开发。 首先,本书涵盖了SQL Server 2000的基础知识,包括数据库的概念、关系模型以及SQL语言的基本语法。...

    轻松搞定 SQL Server 2000程序设计

    通过阅读《轻松搞定 SQL Server 2000程序设计》,读者不仅可以掌握SQL Server 2000的基础操作,还能深入了解其高级特性和应用技巧,为实际项目中的数据库开发打下坚实基础。文件"book301"很可能就是这本书的电子版,...

    轻松掌握SQL第四版(PDG)

    《轻松掌握SQL第四版》是一本专为初学者和进阶者设计的SQL教程,旨在帮助读者全面理解和熟练运用SQL这一强大的数据库查询语言。书中的内容涵盖了SQL的基础知识、数据操作、系统管理以及针对不同流行数据库产品的应用...

    轻松搞定SQL Server 2000 程序设计(PDF).rar

    《轻松搞定SQL Server 2000 程序设计》是一本专为SQL Server 2000用户设计的实战指南,旨在帮助读者深入理解并掌握SQL Server 2000的程序设计技巧和最佳实践。这本书在SQL Server的学习资源中独树一帜,因其实用性而...

    SQL Server 2008 Transact SQL Receipe

    - **SQL Server 架构**: 解释 SQL Server 2008 的内部架构,包括服务器引擎、数据库引擎等组件的工作原理。 - **Transact-SQL 概览**: 介绍 Transact-SQL 的基本语法结构,包括数据定义语言 (DDL)、数据操纵语言 ...

    sql server 2000 程序设计

    通过《轻松搞定 SQL Server 2000 程序设计》这本书,读者不仅可以学习到SQL Server 2000的核心编程技术,还能了解如何在实际项目中运用这些知识,解决各种数据库设计和管理问题。书中的实例和实践指导将有助于加深...

    SQL SERVER2008实用教程

    通过本教程的学习,你可以熟练掌握SQL Server 2008的基本操作,进行数据库的设计、管理、查询以及性能优化。结合提供的PPT电子教案,可以更直观地理解关键概念和实际操作步骤,从而轻松上手数据库的日常管理工作。

    Northwind和pubs数据库(sqlserver和access)

    在学习Northwind和pubs数据库时,我们不仅需要掌握SQL语言的基础,还要理解数据库设计的原则,如范式理论,以确保数据的一致性和完整性。同时,了解关系数据库管理系统(RDBMS)的工作原理,如索引、存储过程、...

    SQL Server 2008

    PPT讲述了数据库的基本原理和SQL Server 2008的应用,全书以理论够用、实用,实践为第一的原则,使读者能够快速、轻松地掌握SQL Server数据库技术与应用。第1~第3章讲述数据库的基本理论知识,其内容包括数据库系统...

    仪器仪表管理系统sql server2012 数据库课程设计

    这部分知识涵盖了SQL的基础语法和高级特性,如JOIN操作、子查询、存储过程、触发器等,这些都是数据库开发者必须掌握的核心技能。通过编写和执行这些SQL脚本,学生可以实际操作数据库,理解其工作原理。 再者,文档...

    SQL_Server从入门到精通

    通过21天的学习,读者不仅能熟练掌握SQL Server的基本操作,还能了解到数据库设计、性能优化和安全管理等多个方面,从而具备解决实际问题的能力。无论是为了个人兴趣,还是为了职业生涯,这都是一个不容错过的起点。...

    sql server 数据库结构查看程序

    同时,掌握SQL Server数据库结构也对于开发和维护基于SQL Server的应用程序非常关键,因为理解数据存储方式和访问模式能直接影响应用程序的性能和稳定性。 总之,"sql server 数据库结构查看程序"是数据库管理员和...

    sqlserver2000看图教程

    《SQL Server 2000 看图教程》是一本专为初学者设计的数据库管理系统学习资料,采用直观的图形化方式,帮助读者轻松掌握SQL Server 2000的核心概念和技术。这本书以PDF格式提供,清晰度高,便于在线阅读或下载保存。...

    SQL Server 2000 学习教程

    《SQL Server 2000 学习教程》是一份专为初学者设计的全面教程,旨在帮助读者深入了解和掌握Microsoft SQL Server 2000这一数据库管理系统。SQL Server 2000是微软公司推出的数据库平台,它在2000年发布,虽然现在...

    SQLServer实用SQL语句大全

    《SQLServer实用SQL语句大全》是一本针对SQL Server数据库管理系统的全面指南,它涵盖了从基础到高级的各种SQL语句的使用方法。SQL Server作为一款广泛应用于企业级数据存储和管理的数据库系统,掌握其SQL语法是每个...

Global site tag (gtag.js) - Google Analytics