第10章 触发器和游标
第10章游标和触发器
UPDATE {table_name|view_name} SET [[{table_name.|view_name.}] column_name = { new_value}[ ...n]
WHERE CURRENT OF cursor_name
其中: – 紧跟UPDATE之后的table_name| view_name:要更新的表 名或视图名,可以加或不加限定。但它必须是声明该游标1的5 SELECT语句中的表名或视图名。
cursor_name:是已声明为FOR UPDATE方式并已打开的 游标名。
16
注意: – ① 使用UPDATE...CURRENT OF语句一次只能更新当前 游标位置确定的那一行,OPEN语句将游标位置定位在结 果集第一行前,可以使用FETCH语句把游标位置定位在 要被更新的数据行处。 – ② 用UPDATE...WHERE CURRENT OF语句更新表中的 行时,不会移动游标位置,被更新的行可以再次被修改, 直到下一个FETCH语句的执行。 – ③ UPDATE...WHERE CURRENT OF语句可以更新多表 视图或被连接的多表,但只能更新其中一个表的行,即所 有被更新的列都来自同一个表。
10
4. 关闭游标 关闭(Close)游标是停止处理定义游标的那个查询。关闭游标并
不改变它的定义,可以再次用open语句打开它,SQL Server会用该游标的定义重新创建这个游标的一个结果集。 关闭游标的语法如下: CLOSE cursor_name 其中: – cursor_name:是已被打开并将要被关闭的游标名字。 – 在如下情况下,SQL Server会自动地关闭已打开的游标
2
10.2.2 游标的定义及使用过程
SQL Server 2012数据库原理与应用第十讲 存储过程、触发器和游标
Output示例
• • • • • • • • • • • • • • • • •
Alter Proc P_Save_ClassInfo (@ClassID Varchar(10),@ClassName Varchar(50), @ClassDesc Varchar(100),@Msg Varchar(20) output) as if Exists(Select * From ClassInfo Where ClassID=@ClassID) begin Update ClassInfo Set ClassName=@ClassName,ClassDesc=@ClassDesc Where ClassID=@ClassID set @Msg='修改成功' end Else begin Insert Into ClassInfo (ClassID,ClassName,ClassDesc) Values (@ClassID,@ClassName,@ClassDesc) set @Msg='添加成功' end
10.1.5 执行存储过程
•
语法
– [ [ EXEC [ UTE ] ] { [ @return_status = ] { procedure_name [ ;number ] | @procedure_name_var } [ [ @parameter = ] { value | @variable [ OUTPUT ] | [ DEFAULT ] ] [ ,...n ] [ WITH RECOMPILE ]
存储过程示例
• Create Procedure P_GetUp90 • as • Select * • From StudScoreInfo • Where StudScore>=90
数据库SQL ServerSQLite教程课件:存储过程、触发器和游标
存储过程、触发器和游标
⒉ 使用 SSMS 创建存储过程 操作步骤如下: (1) 在“对象资源管理器”中展开“数据库”节点,展 开要创建存储过程的数据库。 (2) 展开“可编程性”节点,选择“存储过程”选项, 右击鼠标弹出快捷菜单,选择“新建存储过程”命令,打开 创建存储过程对话框,如图 8-3 所示。
存储过程、触发器和游标
8.1.2 创建存储过程 1. 使用 create procedure 语句创建存储过程 1) 语法格式
存储过程、触发器和游标
参数说明: (1) procedure_name 是要创建的存储过程的名称,它后 面跟一个可选项 number,是一个整数,用来区别一组同名 的存储过程,如 proc1、proc2 等。 (2) @parameter 用来声明存储过程的形式参数。在 create procedure 语句中,可以声明一个或多个参数。 (3) data_type 是参数的数据类型。 (4) varying 指定由 output 参数支持的结果集,仅应用于 游标型参数。
exec xp_logininfo;
存储过程、触发器和游标 例 8-3 查看有关 D:\sq 文件夹的文件信息。显示结果如
图 8-2 所示。代码如下: exec xp_cmdshell 'dir D:\sq\';
图 8-2 扩展存储过程
存储过程、触发器和游标
3) 用户自定义存储过程 用户自定义存储过程 (User-Defined Stored Procedure) 是 由用户设计的存储过程。其名称可以是任意组合 SQL Server 命令规则的字符组合,通常以“usp_”开头,避免以“sp_” 或“xp_”开头,以免造成混淆。自定义的存储过程会被添 加到所属数据库的存储过程中,并以对象的形式保存。
触发器与游标详解
创建触发器为了演示触发器的功能,下面再引入一个简易仓库管理的例子。
在采购配件前,必须首先制定采购计划(如采购计划表 PlanA),然后交由采购员采购,采购回来后,要将配件入库,入库时,除了要修改入库表(配件入库表 InStock)外,还要修改配件库存表(仓库库存表 Stock),还要修改采购计划表(采购计划表 PlanA),因为要修改实际完成的采购量(FinishQty)。
三个数据表如下:采购计划表 PlanA备件入库表 InStock备件库存表 Stock给计划表追加如下数据一、用企业管理器创建触发器例1:对备件入库InStock表建立一个插入触发器utr_InStockIns,其功能为:备件入库时,除了要将入库数据追加到备件入库表(InStock)外,还要修改计划表(PlanA)中对应计划号的完成数量(增加FinishQty)和备件库存表(Stock)中对应备件代码的库存数量(StockQty)。
注:同企业管理器创建的触发器例2:对备件入库表建立一个删除触发器utr_InStockDel,其功能为:删除备件入库中的记录时,除了要删除入库表(InStock)的记录外,还要修改计划表(PlanA)中对应计划号的完成数量(减少FinishQty),还要删除备件库存表(Stock)中对应备件代码的记录。
例3:对备件入库表建立一个更改除触发器utr_InStockUpt,其功能为:更改备件入库中的记录时,除了要更改入库表(InStock)的记录外,还要更改备件库存表(Stock)中对应备件代码的数据,同时,还要更改计划表(PlanA)中对应计划号的完成数量(FinishQty)。
触发器的应用假设你已经按照4.2.3创建触发器中要求创建了插入触发器utr_InStockIns、删除触发器utr_InStockDel和更改触发器utr_InStockUpt,才能做下面的实验。
可以参见4.2.4管理触发器来检查是否已经创建。
游标和触发器
隐式游标 4-3
SQL> SET SERVEROUTPUT ON SQL> DECLARE v_TOYID TOYS.ID%type := '&TOYID'; v_TOYNAME %Type := '&TOYNAME'; BEGIN UPDATE TOYS SET NAME = v_TOYNAME WHERE toyid=v_TOYID; IF SQL%NOTFOUND THEN DBMS_OUTPUT.PUT_LINE('编号未找到。'); ELSE DBMS_OUTPUT.PUT_LINE(‘表已更新'); END IF; END; 如果 DML 语句不影响任何行,则返回 True /
44
数据库
3
George
30
提取行
关闭游标
变量
显式游标 2-2
SQL>SET SERVER OUTPUT ON SQL>DECLARE my_toy_price toys.toyprice%TYPE; CURSOR toy_cur IS 声明游标 SELECT toyprice FROM toys WHERE toyprice<250; BEGIN OPEN toy_cur; 打开游标 LOOP 提取行 FETCH toy_cur INTO my_toy_price; EXIT WHEN toy_cur%NOTFOUND; DBMS_OUTPUT.PUT_LINE ('TOYPRICE=:玩具单价=:'||my_toy_price); END LOOP; CLOSE toy_cur; 关闭游标 END;
SELECT INTO 语句 2-1
数据库中的游标存储过程和触发器
数据库中的游标存储过程和触发器游标、存储过程和触发器是数据库中常用的三种特殊对象。
游标用于在数据库管理系统中对查询结果进行逐行处理,存储过程是一组预定义的SQL语句集合,可以被重复调用执行,而触发器则是在数据库中的特定事件发生时自动执行的一段代码。
首先,我们来了解一下游标。
游标是一个数据库概念,它可以被看作是一个指向查询结果集的指针。
通过游标,我们可以在数据库内部对查询结果集进行逐行处理,从而实现对数据的操作。
游标的使用可以有效地减少数据库服务器的负担,提高数据库性能。
在一些需要对批量数据进行处理的场景下,游标可以发挥重要作用。
例如,当需要对查询结果逐行进行计算、更新或者删除时,可以使用游标定位到每一条记录,并对其进行操作。
接下来,我们了解一下存储过程。
存储过程是一组预定义的SQL语句的集合,它们一起执行一些特定的任务。
存储过程可以包含流程控制、循环结构、条件判断等逻辑,还可以接受参数并返回结果。
存储过程的好处在于可以实现代码复用,提高数据库的性能和可维护性。
通过存储过程,我们可以将常用的SQL操作封装起来,减少了网络传输的开销,提高了数据访问的效率。
另外,存储过程还可以实现权限控制,通过调用存储过程来间接访问数据库,可以避免直接在应用程序中操作数据库,增强了数据的安全性。
最后,我们来了解一下触发器。
触发器是在数据库中特定的事件发生时自动执行的一段代码。
这些事件可以是INSERT、UPDATE或者DELETE操作。
触发器通常被用来在数据库表的数据发生变化时执行相应的操作。
它可以用来保证数据库的数据一致性和完整性,触发器能够在数据被修改之前或之后自动执行,并且可以在代码中加入逻辑判断和业务处理。
例如,在一个订单表中,我们可以定义一个触发器,在插入一条新订单数据时,自动计算订单总金额并更新到订单的总金额字段中。
总结一下,游标、存储过程和触发器是对数据库进行处理和控制的重要工具。
游标可以让我们逐行处理查询结果集,存储过程可以定义逻辑处理、实现代码的复用,而触发器则可以在数据库表的特定事件发生时自动执行一段代码。
数据库原理与应用教学课件(共12章)第10章-游标
10.3.4 游标函数
@@FETCH_STATUS函数 返回被 FETCH 语句执行的最后游标的状态。 返回值如下: ➢0:FETCH 语句成功 ➢−1:FETCH语句失败或此行不在结果集中 ➢−2:被提取的行不存在
11
示例
示例:使用游标遍历“Student”表中的每一条记录。 解决方案:
DECLARE curMaleStudent CURSOR FOR SELECT * FROM Student WHERE StuSex=‘男’ OPEN curMaleStudent FETCH NEXT FROM curMaleStudent WHILE @@FETCH_STATUS = 0
18
10.5嵌套游标
有学生表和系表,游标1先找出系表中的每个系,对于找到的系,再使用游标2 找出该系的所有学生的信息。
19
嵌套游标
语法: declare cursor_name1 for… open cursor_name1 fetch next from cursor_name1 While(@@fetch_status=0) begin
end close curDepartment dea22llocate curDepartment
习题:
使用游标遍历学生表的每一位学生,对每位学生统计SC表该学生的平均 分,并向StudentComment(StuID,Comment)表添加一条学生记录。 如果平均分超过85,Comment字段值为“A”,均分在70-85之间,值 为“B”,60-70之间值为“C”,否则为“D”。
FETCH NEXT FROM curMaleStudent
12
10.3.5-10.3.6 关闭及释放游标
MySQL中触发器和游标的介绍与使用
MySQL中触发器和游标的介绍与使⽤触发器简介触发器是和表关联的特殊的存储过程,可以在插⼊,删除或修改表中的数据时触发执⾏,⽐数据库本⾝标准的功能有更精细和更复杂的数据控制能⼒。
触发器的优点:安全性:可以基于数据库的值使⽤户具有操作数据库的某种权利。
例如不允许下班后和节假⽇修改数据库数据;审计:可以跟踪⽤户对数据库的操作;实现复杂的数据完整性规则。
例如,触发器可回退任何企图吃进超过⾃⼰保证⾦的期货;提供了运⾏计划任务的另⼀种⽅法。
例如,如果公司的帐号上的资⾦低于 5 万元则⽴即给财务⼈员发送警告数据。
MySQL 中使⽤触发器创建触发器创建触发器的技巧就是记住触发器的四要素:监控地点:table;监控事件:insert/update/delete;触发时间:after/before;触发事件:insert/update/delete。
创建触发器的基本语法如下所⽰:CREATE TRIGGER-- trigger_name:触发器的名称;-- tirgger_time:触发时机,为 BEFORE 或者 AFTER;-- trigger_event:触发事件,为 INSERT、DELETE 或者 UPDATE;trigger_name trigger_time trigger_eventON-- tb_name:表⽰建⽴触发器的表名,在哪张表上建⽴触发器;tb_name-- FOR EACH ROW 表⽰任何⼀条记录上的操作满⾜触发事件都会触发该触发器。
FOR EACH ROW-- trigger_stmt:触发器的程序体,可以是⼀条 SQL 语句或者是⽤ BEGIN 和 END 包含的多条语句;trigger_stmttrigger_name:触发器的名称;tirgger_time:触发时机,为 BEFORE 或者 AFTER;trigger_event:触发事件,为 INSERT、DELETE 或者 UPDATE;tb_name:表⽰建⽴触发器的表名,在哪张表上建⽴触发器;trigger_stmt:触发器的程序体,可以是⼀条 SQL 语句或者是⽤ BEGIN 和 END 包含的多条语句;FOR EACH ROW 表⽰任何⼀条记录上的操作满⾜触发事件都会触发该触发器。
事务、存储过程、触发器和游标
串行化 (Serializable): 最高的隔离级别,通过强制事务串行执行,避 免了读写和写写的冲突。
02
存储过程
存储过程的定义和优点
定义
减少网络流量
提高性能
安全性
复用性
存储过程是一组为了完 成特定功能的SQL语句 集合,经过编译和存储 在数据库中,用户通过 调用存储过程来执行这 些SQL语句。
VS
详细描述
当需要对查询结果集中的每一行数据进行 操作时,如修改、删除或插入等,可以使 用游标。但是,由于游标会占用大量数据 库资源,性能较低,因此在使用时应谨慎 考虑,尽量避免在大型数据集上使用游标 。同时,还需要注意避免死锁和并发问题 。
感谢您的观看
THANKS
要点二
详细描述
首先,需要声明一个游标变量并设置其属性,如光标类型 、缓冲区大小等。然后,使用OPEN语句打开游标并执行 查询。接下来,使用FETCH语句从结果集中获取数据,并 使用循环结构逐行处理数据。最后,使用CLOSE语句关闭 游标。
游标的使用场景和注意事项
总结词
游标适用于需要逐行处理查询结果集的 场景,但需要注意性能和资源消耗问ommitted): 最低的隔离级别,一个事务可以看 到其他未提交事务的修改。
02
读已提交 (Read Committed): 一个事务只能看到已经提交的事务所 做的修改。
03
可重复读 (Repeatable Read): 在同一事务中多次读取同一数据返回 的结果是一致的。
一致性 (Consistency)
事务必须使数据库从一个一致性状态转变到另一个一致性状态。一致 性是指数据库满足完整性约束。
隔离性 (Isolation)
在事务完成之前,它所做的修改对其他事务是透明的。这意味着并发 执行的事务不会互相干扰。
第10章游标、存储过程和触发器
游标属性
BEGIN IF xs_cur1%ISOPEN = FALSE Then
OPEN
END IF;
xs_cur1('061101' );
FETCH xs_cur1 INTO sname, szym; CLOSE xs_cur1; dbms_output.put_line('学生姓名:' || sname ||' , 专业名:' || szym); END;
游标控制语句
【例】声明一个游标xs_cur1,对应XS表中的查询 操作,此查询操作检索XS表中指定学号的学生的部 分信息(姓名和专业名)。(带参数) DECLARE CURSOR varchar2(10)) IS xs_cur1(sxh in
SELECT
FROM
xm,zym
xs
WHERE
xh = sxபைடு நூலகம்;
游标控制语句
【例】将上面完整的游标应用实例变换为带参数形式: SET ServerOutput ON;
DECLARE
sname varchar2(30);
szym
cursor IS WHERE
varchar2(50);
xs_cur1(sxh in system.xs.xh%type) FROM xs xh =sxh;
【例】关闭游标xs_cur1:
CLOSE xs_cur1;
游标控制语句
【例】将上面的分步操作合并成一个完整的游标应 用实例:
SET ServerOutput ON;
DECLARE sname varchar2(30); szym varchar2(30); xs_cur1 IS FROM xs CURSOR WHERE
Oracle 12c数据库基础教程-Oracle 12c数据库游标、存储过程和触发器
CURSOR MyCur(varDepid NUMBER) IS SELECT Emp_Id, Emp_Name FROM C##HRSYS.Employees
WHERE Dep_id = varDepid;
BEGIN --开始程序体 IF MyCur%ISOPEN = FALSE Then OPEN MyCur(1); -- 读取部门编号为1的员工记录 END IF; FETCH MyCur INTO varId, varName; --读取当前游标位置的数据 WHILE MyCur%FOUND --如果当前游标有效,则执行循环 LOOP dbms_output.put_line('员工编号:' || varId ||', 姓名:' || varName); --显示读取的数据 FETCH MyCur INTO varId, varName; --读取当前游标位置的数 据 END LOOP; CLOSE MyCur; --关闭游标
3.分支语句CASE
--定义游标, varDepid为参数, 指定部门编号 CURSOR MyCur(varDepid NUMBER) IS
SELECT Emp_Id, Emp_Name FROM C##HRSYS.Employees WHERE Dep_id = varDepid;
BEGIN --开始程序体 FETCH MyCur INTO varId, varName; --读取当前游标位置的数据 CLOSE MyCur; --关闭游标 dbms_output.put_line('员工编号:' || varId ||', 姓名:' ||
存储过程、触发器和游标
存储过程、触发器和游标
1.4执行存储过程
EXECUTE命令。
如果被调用的存储过程需要参数输入时,在存储 过程名后逐一给定,每一个参数用逗号隔开,不 必使用括号。
如果没有使用@参数名=default这种方式传入值,则参
数的排列必须和建立存储过程所定义的次序对应。
用来接受输出值的参数则必须加上OUTPUT。
存储过程、触发器和游标
1.1 存储过程概述 一般来讲,应使用SQL Server中的存储过程而 不使用存储在客户计算机本地的 T-SQL 程序, 其优势主要表现在: (1)允许模块化程序设计。 (2)允许更快速地执行。 (3)减少网络流量。 (4)可作为安全机制使用。
存储过程、触发器和游标
存储过程、触发器和游标
目标:
了解存储过程的优点 掌握如何创建存储过程(参数、返回值) 掌握如何调用存储过程 了解为什么需要触发器 理解触发器的工作原理 掌握如何使用inserted表和deleted表 掌握如何创建: INSERT触发器 UPDATE触发器 DELETE触发器 游标的基本更新 理解游标的使用步骤
存储过程、触发器和游标
1.3 创建存储过程
[例11-4]在仓库库存数据库创建带OUTPUT参数 的存储过程,用于计算指定的商品的平均价格, 存储过程中使用一个输入参数(商品名)和一个 输出参数(平均价格)。 CREATE PROCEDURE Pname @p_n varchar(20), @aveage int OUTPUT AS SELECT @aveage= avg(单价) FROM 商品 WHERE 商品名称=@p_n
存储过程、触发器和游标
1.3 创建存储过程
实训指导书(10)触发器
实训10 触发器1、实训目的(1)理解触发器的作用(2)掌握创建触发器的方法;(3)掌握查看触发器信息的方法;(4)掌握删除和修改触发器的方法。
2、素材准备SQL Server 2005,Xk数据库,YGGL数据库。
实验准备:1)创建用于企业管理的员工管理数据库,数据库名为YGGL,包含员工的信息、部门信息以及员工的薪水信息。
数据库YGGL包含下列3个表:(1)employees:员工信息表。
(2)departments:部门信息表。
(3)salary:员工薪水情况表。
各表的结构如下:employees表结构2)在企业管理器中向表employees,departments、salary中加入记录employees表departments表salary表3、实训内容3.1基本训练1、完成教材中的例题。
(50分钟)2、对于yggl数据库,表employees的departmentid列与表departments的departmentid列应满足参照完整性规则,即:●向employees表添加一记录时,该记录的departmentid值在departments表中应存在。
●修改departments表的departmentid字段值时,该字段在employees表中的对应值也应该修改。
●删除departments表中一记录时,该记录的departmentid字段值在employees表中对应的记录也应该删除。
上述参照完整性规则,在此通过触发器实现。
3、对于yggl数据库,表employees的employeeid列与表salary的employeeid列应该满足参照完整性规则,请用触发器实现两个表间的参照完整性。
●向salary表添加一记录时,该记录的employeeid值在employees表中应存在。
●修改employees表的employeeid字段值时,该字段在salary表中的对应值也应该修改。
游标,存储过程,触发器的区别与使用
游标,存储过程,触发器的区别与使⽤⼀、游标*什么是游标游标实际上是⼀种能从包括多条数据记录的结果集(结果集是select查询之后返回的所有⾏数据的集合)中每次提取⼀条记录的机制充当指针的作⽤,遍历结果中的所有⾏,但他⼀次只指向⼀⾏。
游标的结果集是由SELECT语句产⽣,如果处理过程需要重复使⽤⼀个记录集,那么创建⼀次游标⽽重复使⽤若⼲次,⽐重复查询数据库要快的多。
也可以说,SQL的游标是⼀种临时的数据库对象,可以⽤来存放在数据库表中的数据⾏副本,也可以指向存储在数据库中的数据⾏的指针。
游标提供了在逐⾏的基础上操作表中数据的⽅法。
⼀般复杂的存储过程,都会有游标的出现,他的⽤处主要有:1.定位到结果集中的某⼀⾏。
2.对当前位置的数据进⾏读写。
3.可以对结果集中的数据单独操作,⽽不是整⾏执⾏相同的操作。
4.是⾯向集合的数据库管理系统和⾯向⾏的程序设计之间的桥梁。
*不⾜:数据量⼩时才使⽤游标,因为:1.游标使⽤时会对⾏加锁,系统上跑的不只我们⼀个业务,这就会影响其他业务的正常进⾏;2.数据量⼤时其效率也较低效;3.游标其实是相当于把磁盘数据整体放⼊了内存中,如果游标数据量⼤则会造成内存不⾜,书写格式:DECLARE mycursor Cursor --定义游标FOR SELECT EmployeeID FROM ... --查询语句OPEN mycursor --打开游标DECLARE @id int --根据查询语句相应地定义变量FETCH NEXT FROM mycursor INTO @id --逐⾏提取游标集中的⾏WHILE @@FETCH_STATUS=0 --通过检查全局变量@@FETCH_STATUS来判断是否已读完游标集中所有⾏BEGIN*此处书写要执⾏的Sql语句*FETCH NEXT FROM mycursor INTO @id --移动游标ENDCLOSE mycursor --关闭游标DEALLOCATE mycursor --释放游标实例:根据产品名称(名称⼀样视为同⼀产品)统计该产品的销售数量,如果在统计表(ProductStatistics)中能找到这个产品名称的数据,则插⼊这个产品的统计结果,如果不能找到这个产品名称的数据,则修改统计结果。
第10章游标操作与应用36页PPT
»2019/10/26
»20
ABSOLUTE {n | nvar} 如果n或nvar为正数,则 返回游标结果集中的第n或nvar行数据。如果n或 nvar 为负数,则返回结果集内倒数第n或nvar 行数据。若n或nvar超过游标的数据子集范畴, 则FETCH_STARS返回-1,在该情况下,如果n或 nvar为负数,则执行FETCH NEXT命令会得到第一 行数据,如果n或nvar为正值,执行FETCH PRIOR 命令则会得到最后一行数据。n或nvar 可以是一 固定值也可以是一smallint, tinyint 或int类 型的变量。
»2019/10/26
»6
10.1 游标声明
10.1.1 游标声明(2) 参数说明:
(1)LOCAL和GLOBAL选项分别说明DECLARE CURSOR语 句所声明的游标为局部游标和全局游标。
(2)FORWARD_ONLY选项声明只进游标,即FETCH语句 中只能使用NEXT选项。
(3)STATIC与SQL-92声明中的INSENTIVE关键字的功能相 同,它将游标声明为静态游标,禁止应用程序通过它修改 基表数据。
»2019/10/26
»13
1.1.2 游标变量
第一种: 先声明游标和游标变量,之后用SET语句将游标赋给游标变 量。 例如:
DECLARE cur_var CURSOR DECLARE C1 CURSOR FOR SELECT * FROM COURSE SET cur_var=C1
»2019/10/26
第10章 游标操作和应用
游标是数据库中一个十分重要的概念。游标提 供了一种对从表中检索出的数据进行操作的灵 活手段,就本质而言,游标实际上是一种能从 包括多条数据记录的结果集中每次提取一条记 录的机制 。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
10.1.2触发器的功能
完成更复杂的数据约束 检查所做的SQL所作的操作是否允许 修改其它数据表里的数据 调用更多的存储过程 返回自定义的错误信息 更改原本要操作的SQL语句 防止数据表结构被更改或数据表被删除
2013-9-10
SQL Server 2005
2013-9-10
SQL Server 2005
13
AFTER触发器示例
例10.1 修改学生表中的数据时,下述触发器将向客户 显示一条消息。 CREATE TRIGGER 学生_update ON 学生表 AFTER UPDATE AS BEGIN RAISERROR ('注意:有人修改学生表的数据',16,10) END GO
创建Instead Of触发器与创建After触发器的语法几乎 一样,只是简单地把After改为Instead Of。
2013-9-10
SQL Server 2005
15
INSTEAD OF触发器示例
例10.2 当有人试图修改学生表中的数据,利用下述触发器可以跳过 修改数据的SQL语句(防止数据被修改),并向客户端显示一条消 息。 CREATE TRIGGER 学生_update ON 学生表 INSTEAD OF UPDATE AS BEGIN RAISERROR ('对不起,学生表的数据不允许修改',16,10) END GO
2013-9-10
SQL Server 2005
8
在图形界面下创建触发器
2013-9-10
SQL Server 2005
9
在图形界面下创建触发器
(2)右击“触发器”,在弹出的快捷菜单中选择“新建触发器” 选项,弹出“查询编辑器”对话框,在“查询编辑器”的编辑 区里SQL Server已经预写入了一些建立触发器相关的SQL语句, 如 Server 2005
16
查看触发器
1.通过 SQL Server Management Studio
2013-9-10
SQL Server 2005
17
查看触发器
2.通过系统存储过程 (1)sp_help 系统存储过程sp_help可以了解如触发器名称、 类型、创建时间等基本信息,其语法格式为: sp_help '触发器名' 例如:sp_help '学生_insert' (2)sp_helptext 系统存储过程sp_helptext可以查看触发器的文本 信息,其语法格式为: sp_helptext '触发器名' 例如:sp_helptext '学生_insert'
2013-9-10 SQL Server 2005 22
10.3 DDL触发器
DDL触发器是SQL Server 2005新增的一个 触发器类型,像常规触发器一样,DDL 触发器将激发存储过程以响应事件。但与 DML触发器不同的是,它们不会为响应针 对表或视图的UPDATE、INSERT或 DELETE语句而激发。相反,它们会为响 应多种数据定义语言(DDL)语句而激发。 这些语句主要是以 CREATE、ALTER和 DROP开头的语句。DDL触发器可用于管 理任务,例如审核和控制数据库操作。
2013-9-10
SQL Server 2005
14
创建INSTEAD OF触发器
创建INSTEAD OF触发器的语法代码如下 :
CREATE TRIGGER <trigge_name> ON [<schema name>.]<table or view name> [WITH ENCRYPTION|EXECUTE AS <CALLER|SELF|<user>>] {INSTEAD OF} {[INSERT][,][UPDATE]>[,]<[DELETE]} [WITH APPEND] [NOT FOR REPLICATION] AS <<sql statements>|EXTERNAL NAME <assembly method specifier>>
2013-9-10 SQL Server 2005 6
10.2.3 创建DML触发器的注意事项
CREATE TRIGGER语句必须是批处理中的第一 个 语句
创建DML触发器的权限默认分配给表的所有 者,且不能将该权限转给其他用户 DML触发器为数据库对象,其名称必须遵循 标识符的命名规则 只能在当前数据库中创建DML触发器 不能对临时表或系统表创建DML触发器 WRITETEXT语句不会触发INSERT或UPDATE 触发器
SQL Server 2005
11
用SQL语句创建触发器
创建AFTER触发器的语法代码如下: CREATE TRIGGER <trigge_name> ON [<schema name>.]<table or view name> [WITH ENCRYPTION|EXECUTE AS <CALLER|SELF|<user>>] {FOR|AFTER} {[INSERT][,][UPDATE]>[,]<[DELETE]} [WITH APPEND] [NOT FOR REPLICATION] AS <<sql statements>|EXTERNAL NAME <assembly method specifier>>
2013-9-10 SQL Server 2005 18
修改触发器
修改触发器的语法代码如下:
ALTER TRIGGER <trigge_name> ON {table|view} [WITH ENCRYPTION|EXECUTE AS <CALLER|SELF|<user>>] {FOR|AFTER|INSTEAD OF} {[INSERT][,][UPDATE]>[,]<[DELETE]} [NOT FOR REPLICATION] AS <<sql statements>|EXTERNAL NAME <assembly method specifier>> 分析上述语法代码可以发现,修改触发器语法中所涉及到主要参数和 创建触发器的主要参数几乎一样,在此不再赘述。
2013-9-10
SQL Server 2005
10
在图形界面下创建触发器
(3)修改“查询编辑器”里的代码 (4)单击工具栏中的“分析”按钮,检查 一下是否语法有错,如果在“结果”对话 框中出现“命令已成功完成”,则表示语 法没有错误。 (5)语法检查无误后,单击“执行”按钮, 生成触发器。
2013-9-10
2013-9-10 SQL Server 2005 7
10.2.4 创建AFTER触发器
步骤如下: (1)启动“SQL Server Management Studio”,在 “对象资源管理器”下选择“数据库”,定位到具 体的数据库,展开其下的“表”树型目录,找到具 体的表,并选中其下的“触发器”项,如下图所示。
2013-9-10 SQL Server 2005 5
10.2.2 DML触发器的工作原理
After触发器的工作原理 After触发器是在记录更变完之后才被激 活执行。 Instead Of触发器的工作原理 Instead Of触发器与After触发器不同。 After触发器是在Insert、Update和Delete 操作完成后才激活的,而Instead Of触发 器,是在这些操作进行之前就激活了,并 且不再去执行原来的SQL操作,而去运行 触发器本身的SQL语句。
Drop Trigger 触发器名
2013-9-10
SQL Server 2005
20
禁用DML触发器
1.在图形界面方式下禁用DML触发器
按照在SQL Server Management Studio中查看触发器的 方法打开“触发器列表”对话框。 右击其中一个触发器,在弹出快捷菜单中选择“禁用” 选项,即可。
SQL Server 2005
4
10.2 DML触发器
10.2.1 DML触发器的类型 After触发器:这类触发器是在记录已经改变完 之后(after),才会被激活执行,它主要是用 于记录变更后的处理或检查,一旦发现错误, 也可以用Rollback Transaction语句来回滚本次 的操作。 Instead Of触发器:这类触发器一般是用来取 代原本要进行的操作,在记录变更之前发生的, 它并不去执行原来SQL语句里的操作(Insert、 Update、Delete),而去执行触发器本身所定 义的操作。
2013-9-10
SQL Server 2005
19
删除DML触发器
(1) 在图形界面方式下删除触发器 按照在SQL Server Management Studio中查看
触发器的方法,找到“触发器列表”对话框。 右击要删除的某个触发器,在弹出快捷菜单中
选择“删除”选项。
(2)用SQL语句删除触发器,删除触发器 的语法代码如下所示:
2.使用T-SQL语句禁用DML触发器
语法如下:
Alter table 数据表名 Disable trigger 触发器名或ALL 如果要禁用所有触发器,用“ALL”来代替触发器名。
2013-9-10 SQL Server 2005 21
启用DML触发器
1.图形界面方式下启用触发器 启用触发器与禁用触发器类似,只是在弹 出的快捷菜单中选择“启用”选项即可。 2.使用T-SQL语句启用触发器 其语法如下: Alter table 数据表名 Enable trigger 触发器名或ALL 如果要启用所有触发器,用“ALL”来代 替触发器名。