sqlserver_SQL触发器的使用及语法

sqlserver_SQL触发器的使用及语法
sqlserver_SQL触发器的使用及语法

定义:何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序。触发器是一个特殊的存储过程。常见的触发器有三种:分别应用于Insert , Update , Delete 事件。

我为什么要使用触发器?比如,这么两个表:

Create Table Student(--学生表StudentID int primary key,--学号....

)

Create T able BorrowRecord(--学生借书记录表BorrowRecord int identity(1,1),--流水号StudentID int ,--学号BorrowDate datetime,--借出时间ReturnDAte Datetime,--归还时间...

)

用到的功能有: 1.如果我更改了学生的学号,我希望他的借书记录仍然与这个学生相关(也就是同时更改借书记录表的学号);

2.如果该学生已经毕业,我希望删除他的学号的同时,也删除它的借书记录。等等。

这时候可以用到触发器。对于1,创建一个Update触发器:

Create Trigger truStudent On Student--在Student表中创建触发器for Update--为什么事件触发As

--事件触发后所要做的事情

if Update(StudentID)

begin

Update BorrowRecord Set StudentID=i.StudentID

From BorrowRecord br , Deleted d ,Inserted i--Deleted和Inserted临时表Where br.StudentID=d.StudentID

end

理解触发器里面的两个临时的表:Deleted , Inserted 。注意Deleted 与Inserted分别表示触发事件的表“旧的一条记录”和“新的一条记录”。一个数据库系统中有两个虚拟表用于存储在表中记录改动的信息,分别是:虚拟表Inserted虚拟表Deleted

在表记录新增时存放新增的记录不存储记录修改时存放用来更新的新记录存放更新前的记录删除时不存储记录存放被删除的记录

一个Update 的过程可以看作为:生成新的记录到Inserted表,复制旧的记录到Deleted表,然后删除Student记录并写入新纪录。

对于2,创建一个Delete触发器Create trigger trdStudent On Student for Delete As

Delete BorrowRecord From BorrowRecord br , Delted d Where br.StudentID=d.StudentID

从这两个例子我们可以看到了触发器的关键:A.2个临时的表;B.触发机制。SQL触发器实例2

USE Master GO

IF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE XTYPE = ’U’AND NAME = ’卷烟库存表’) DROP TABLE 卷烟库存表GO

IF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE XTYPE = ’U’AND NAME = ’卷烟销售表’) DROP TABLE 卷烟销售表GO

--业务规则:销售金额= 销售数量* 销售单价业务规则。

CREATE TABLE 卷烟销售表(

卷烟品牌VARCHAR(40) PRIMARY KEY NOT NULL, 购货商VARCHAR(40) NULL, 销售数量INT NULL, 销售单价MONEY NULL, 销售金额MONEY NULL )

GO

--业务规则:库存金额= 库存数量* 库存单价业务规则。

CREATE TABLE 卷烟库存表(

卷烟品牌VARCHAR(40) PRIMARY KEY NOT NULL, 库存数量INT NULL, 库存单价MONEY NULL, 库存金额MONEY NULL )

GO

--创建触发器,示例 1

IF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE XTYPE = ’TR’AND NAME = ’T_INSERT_卷烟库存表’) DROP TRIGGER T_INSERT_卷烟库存表GO

CREATE TRIGGER T_INSERT_卷烟库存表ON 卷烟库存表FOR INSERT AS

--提交事务处理BEGIN TRANSACTION --强制执行下列语句,保证业务规则UPDATE 卷烟库存表SET 库存金额= 库存数量* 库存单价WHERE 卷烟品牌IN (SELECT 卷烟品牌from INSERTED) COMMIT TRANSACTION GO

INSERT INTO 卷烟库存表(卷烟品牌,库存数量,库存单价,库存金额) SELECT ’红塔山新势力’,100,12,1200 UNION ALL SELECT ’红塔山人为峰’,100,22,NULL UNION ALL SELECT ’云南映像’,100,60,500 UNION ALL SELECT ’玉溪’,0,30,0 GO

--查询数据

SELECT * FROM 卷烟库存表GO

--触发器示例 2

IF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE XTYPE = ’TR’AND NAME = ’T_INSERT_卷烟销售表’) DROP TRIGGER T_INSERT_卷烟销售表GO

CREATE TRIGGER T_INSERT_卷烟销售表ON 卷烟销售表FOR INSERT AS

BEGIN TRANSACTION --检查数据的合法性:销售的卷烟是否有库存,或者库存是否大于零IF NOT EXISTS ( SELECT 库存数量FROM 卷烟库存表WHERE 卷烟品牌IN (SELECT 卷烟品牌FROM INSERTED) )

BEGIN

--返回错误提示RAISERROR(’错误!该卷烟不存在库存,不能销售。’,16,1) --回滚事务ROLLBACK

RETURN

END

IF EXISTS ( SELECT 库存数量FROM 卷烟库存表WHERE 卷烟品牌IN (SELECT 卷烟品牌FROM INSERTED) AND 库存数量<= 0 )

BEGIN

--返回错误提示RAISERROR(’错误!该卷烟库存小于等于0,不能销售。’,16,1) --回滚事务ROLLBACK

RETURN

END

--对合法的数据进行处理

--强制执行下列语句,保证业务规则UPDATE 卷烟销售表SET 销售金额= 销售数量* 销售单价WHERE 卷烟品牌IN (SELECT 卷烟品牌FROM INSERTED)

DECLARE @卷烟品牌VARCHAR(40) SET @卷烟品牌= (SELECT 卷烟品牌FROM INSERTED)

DECLARE @销售数量MONEY SET @销售数量= (SELECT 销售数量FROM INSERTED)

UPDATE 卷烟库存表SET 库存数量= 库存数量- @销售数量, 库存金额= (库存数量- @销售数量)*库存单价WHERE 卷烟品牌= @卷烟品牌COMMIT TRANSACTION GO

--请大家自行跟踪[卷烟库存表]和[卷烟销售表]的数据变化。--针对[卷烟销售表],插入第一条测试数据,该数据是正常的。

INSERT INTO 卷烟销售表(卷烟品牌,购货商,销售数量,销售单价,销售金额) SELECT ’红塔山新势力’,’某购货商’,10,12,1200 GO

--针对[卷烟销售表],插入第二条测试数据,该数据销售金额不等于销售单价 * 销售数量。--触发器将自动更正数据,使销售金额等于销售单价* 销售数量。

INSERT INTO 卷烟销售表(卷烟品牌,购货商,销售数量,销售单价,销售金额) SELECT ’红塔山人为峰’,’某购货商’,10,22,2000 GO

--针对[卷烟销售表],插入第三条测试数据,该数据中的卷烟品牌在卷烟库存表中找不到对应。--触发器将报错。

INSERT INTO 卷烟销售表(卷烟品牌,购货商,销售数量,销售单价,销售金额) SELECT ’红河V8’,’某购货商’,10,60,600 GO

--针对[卷烟销售表],插入第三条测试数据,该数据中的卷烟品牌在卷烟库存表中库存为0。--触发器将报错。

INSERT INTO 卷烟销售表(卷烟品牌,购货商,销售数量,销售单价,销售金额) SELECT ’玉溪’,’某购货商’,10,30,300 GO

--查询数据SELECT * FROM 卷烟库存表

SELECT * FROM 卷烟销售表GO

--修改触发器--实质上,是将CREATE TRIGGER ... 修改为ALTER TRIGGER ...即可。

--删除触发器DROP TRIGGER xxx GO

--删除测试环境DROP TABLE 卷烟库存表GO

DROP TABLE 卷烟销售表GO

DROP TRIGGER T_INSERT_卷烟库存表GO

DROP TRIGGER T_INSERT_卷烟销售表GO

################################################ ##################

触发器的基础知识和例子:create trigger tr_name on table/view {for | after | instead of } [update][,][insert][,][delete] [with encryption] as {batch | if update (col_name) [{and|or} update (col_name)] }

说明:

1 tr_name :触发器名称

2 on table/view :触发器所作用的表。一个触发器只能作用于一个表

3 for 和after :同义

4 after 与instead of :sql 2000新增项目afrer 与instead of 的区别After

在触发事件发生以后才被激活,只可以建立在表上Instead of

代替了相应的触发事件而被执行,既可以建立在表上也可以建立在视图上

5 insert、update、delete:激活触发器的三种操作,可以同时执行,也可选其一

6 if update (col_name):表明所作的操作对指定列是否有影响,有影响,则激活触发器。此外,因为delete 操作只对行有影响,所以如果使用delete操作就不能用这条语句了(虽然使用也不出错,但是不能激活触发器,没意义)。

7 触发器执行时用到的两个特殊表:deleted ,inserted deleted 和inserted 可以说是一种特殊的临时表,是在进行激活触发器时由系统自动生成的,其结构与触发器作用的表结构是一样的,只是存放的数据有差异。

下面表格说明deleted 与inserted 数据的差异deleted 与inserted 数据的差异Inserted

存放进行insert和update 操作后的数据Deleted

存放进行delete 和update操作前的数据注意:update 操作相当于先进行delete 再进行insert ,所以在进行update操作时,修改前的数据拷贝一条到deleted 表中,修改后的数据在存到触发器作用的表的同时,也同时生成一条拷贝到insered表中

/////////

CREATE TRIGGER [TRIGGER admixture_receive_log] ON dbo.chl_lydj FOR UPDATE AS

begin

declare @djsfxg char(10)declare @wtbh char(20) select @wtbh=wtbh from inserted update ly_tzk set djsfxg='已修改' where wtbh=@wtbh end

if (select data_sfjl from t_logsetup)='是' begin

declare @oldcjmc char (100)declare @oldlyrq datetime

declare @oldbzbh char (60)declare @oldzl char (20) declare @olddj char (10)

declare @newcjmc char (100)declare @newlyrq datetime declare @newbzbh char (60)declare @newzl char (20)

declare @newdj char (10)

declare @xgr char (20)

select

@oldcjmc=cjmc,@oldlyrq=lyrq,@oldbzbh=bzbh,@oldzl=zl,@olddj=dj from deleted

select

@newcjmc=cjmc,@newlyrq=lyrq,@newbzbh=bzbh,@newzl=zl,@newdj=dj from inserted select @xgr=xgr from t_modifyuser where @wtbh=wtbh

if @oldcjmc<>@newcjmc begin

insert into t_modifylog (wtbh, mod_time, mod_table, mod_field, ori_value, now_value, mod_people) values (@wtbh,getdate(), 'chl_lydj','cjmc', @oldcjmc, @newcjmc, @xgr) end

end

//////////修改时,直接把‘create’改为‘alter’即可

CREATE TRIGGER [TRIGGER ly_tzk_syf] ON dbo.ly_tzk FOR insert AS

begin

declare @clmc char(100)declare @dwbh char(100) declare @syf char(100)declare @dwgcbh char(100) declare @wtbh char(50) declare @dj_1 money declare @feiyong_z money declare

@feiyong_xf money declare @feiyong_sy money declare @dj char(20) select @wtbh=wtbh , @clmc=clmc , @dwbh=dwbh ,@syf=syf from inserted select@dj=dj from feihao_bz where clmc=@clmc select @feiyong_z=feiyong_z, @feiyong_xf=feiyong_xf, @feiyong_sy=feiyong_sy from gongchengxinxi where dwgcbh=@dwbh

set @dj_1=convert(money ,@dj) if @dj_1 <>0 begin

set @feiyong_xf=@feiyong_xf+@dj_1 set @feiyong_sy=@feiyong_sy-@dj_1

update ly_tzk set syf=@dj where wtbh=@wtbh update gongchengxinxi set feiyong_xf=@feiyong_xf, feiyong_sy=@feiyong_sy where dwgcbh=@dwb h

end

else update ly_tzk set syf=convert(char , 0.0) where wtbh=@wtbh end

//////////////////////

CREATE TRIGGER [TRIGGER ly_tzk_syf_shanchu] ON dbo.ly_tzk FOR delete AS

begin

declare @clmc char(100)declare @dwbh char(100)declare @dwgcbh char(100) declare @wtbh char(50) declare @feiyong_z money declare @feiyong_xf money declare @feiyong_sy money declare @syf char(100)declare @syf_1 money --declare @dj char(20)declare @dj_1 money select @wtbh=wtbh , @clmc=clmc , @dwbh=dwbh ,@syf=syf from inserted

--select@dj=dj from feihao_bz where clmc=@clmc select @feiyong_z=feiyong_z, @feiyong_xf=feiyong_xf, @feiyong_sy=feiyong_sy from gongchengxinxi where dwgcbh=@dwbh

set @syf_1=convert(money ,@syf) if @syf_1 <>0 begin

set @feiyong_xf=@feiyong_xf-@syf_1 set @feiyong_sy=@feiyong_sy+@syf_1 update gongchengxinxi set feiyong_xf=@feiyong_xf, feiyong_sy=@feiyong_sy where dwgcbh=@dwb h

end

end

SQL Server2008触发器学习笔记

触发器 一﹕触发器是一种特殊的存储过程﹐它不能被显式地调用﹐而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活。所以触发器可以用来实现对表实施复杂的完整性约束。 二﹕SQL Server为每个触发器都创建了两个专用表﹕Inserted表和Deleted表。这两个表由系统来维护﹐它们存在于内存中而不是在数据库中。这两个表的结构总是与被该触发器作用的表的结构相同。触发器执行完成后﹐与该触发器相关的这两个表也被删除。Deleted表存放由于执行Delete或Update语句而要从表中删除的所有行。Inserted表存放由于执行Insert或Update语句而要向表中插入的所有行。 三﹕Instead of 和After触发器 SQL Server提供了两种触发器﹕Instead of 和After 触发器。 这两种触发器的差别在于他们被激活的操作﹕ Instead of触发器用于替代引起触发器执行的T-SQL语句。除表之外﹐Instead of 触发器也可以用于视图﹐用来扩展视图可以支持的更新操作。 After触发器在一个Insert,Update或Deleted语句之后执行﹐进行约束检查等动作都在After 触发器被激活之前发生。After触发器只能用于表。一个表或视图的每一个修改动作(insert,update和delete)都可以有一个instead of 触发器﹐一个表的每个修改动作都可以有多个After触发器。 INSTEAD OF触发器被用于更新那些没有办法通过正常方式更新的视图。通常不能在一个基于连接的视图上进行DELETE操作,可以编写一个INSTEAD OF DELETE触发器来实现删除。可以访问那些如果视图是一个真正的表时已经被删除的数据行,它将把删除的行存储在deleted临时表中。 本次练习将通过具体的例子介绍如何使用INSTEAD OF触发器,使读者掌握INSTEAD OF 触发器的使用方法。 向student表中插入数据时,检查学号是否存在于student表中,如存在则进行插入操作,否则就不插入,具体语句如下所示: CREATE TRIGGER [checkid] ON dbo.student INSTEAD OF insert AS IF NOT EXISTS(SELECT * FROM dbo.student WHERE ID=(SELECT ID FROM INSERTED)) BEGIN ROLLBACK TRANSACTION PRINT '要处理记录的学号不存在!' END ELSE BEGIN INSERT NTO dbo.student select * from inserted

SQL server数据库设计实例

数据库原理与应用 课程设计A报告 姓名:袁一帆学号:20121480 学院(系):管理学院专业:信息管理与信息系统

班级:12级信管1 班

襄阳迈博信息科技有限公司企业考勤管理系统 一、系统目标设计 1系统开发的总体任务是实现企业员工考勤管理的系统化、规范化、和自动化。 2能够和人事管理系统、工资管理系统相结合,真正实现企业高效、科学、现代化的员工管理。 二、开发实际思想 1尽量采用公司现有软硬件环境,及先进的管理系统开发方案,从而达到充分利用公司现有资源,提高系统开发水平和应用效果的目的。 2员工考勤管理系统能够和考勤机相连接,从而完成自动、高效、科学的考勤信息输入。 3系统采用模块化程序设计方法,既便与系统功能的各种组合和修该,又便于未参与开发的技术维护人员补充、维护。 系统应具备数据库维护功能,即使根据用户需求进行数据的添加、删除、修改、被分等操作。 系统需求分析 1 考勤管理涉及企业人事管理的多个方面,如员工职务升迁、工资发放、奖金发放、员工医疗保险发放等等。本利自重的考勤管理系统需要完成功能主要有以下几点。 2 员工考勤信息处理。该莫完成员工考勤情况的输入、修改等操作。如果企业内有考勤机,可以将它的输出处理后,形成考勤管理系统考勤模块的

输入。 3 企业缺勤类型的设定。 4 企业考勤统计。该模块可对某个员工进行考勤情况的统计,生成统计报表。 5 缺勤时间,缺勤类型对工资的影响 6 缺勤时间,缺勤类型对升职的影响 数据字典 数据项 表1 名称员工编号 说明每个员工拥有唯一的编号 类型字符型 长度 4 有关数据存储员工基本信息存储 表2 名称员工姓名

SQL触发器基本教程

一、创建一个简单的触发器 触发器是一种特殊的存储过程,类似于事件函数,SQL Server? 允许为INSERT、UPDATE、DELETE 创建触发器,即当在表中插入、更新、删除记录时,触发一个或一系列T-SQL语句。触发器可以在查询分析器里创建,也可以在表名上点右键->“所有任务”->“管理触发器”来创建,不过都是要写T-SQL 语句的,只是在查询分析器里要先确定当前操作的数据库。 创建触发器用CREATE TRIGGER CREATE TRIGGER 触发器名称 ON 表名 FOR I NSERT、UPDATE 或DELETE AS T-SQL 语句 注意:触发器名称是不加引号的。 如下是联机丛书上的一个示例,当在titles 表上更改记录时,发送邮件通知MaryM。CREATE TRIGGER reminder ON titles FOR INSERT, UPDATE, DELETE AS EXEC master..xp_sendmail 'MaryM', 'Don''t forget to print a report for the distributors.' 二、删除触发器 用查询分析器删除 在查询分析器中使用drop trigger 触发器名称来删除触发器。 也可以同时删除多个触发器:drop trigger 触发器名称,触发器名称... 注意:触发器名称是不加引号的。在删除触发器之前可以先看一下触发器是否存在: if Exists(select name from sysobjects where name=触发器名称and xtype='TR') 用企业管理器删除 在企业管理器中,在表上点右键->“所有任务”->“管理触发器”,选中所要删除的触发器,然后点击“删除”。 三、重命名触发器 用查询分析器重命名 exec sp_rename 原名称, 新名称 sp_rename 是SQL Server? 自带的一个存储过程,用于更改当前数据库中用户创建的对象的名称,如表名、列表、索引名等。

SQL触发器全过程(含实例讲解)

SQL触发器全过程 第一、概述 一:触发器是一种特殊的存储过程,它不能被显式地调用,而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活。所以触发器可以用来实现对表实施复杂的完整性约`束。 二: SQL Server为每个触发器都创建了两个专用表:Inserted表和Deleted 表。这两个表由系统来维护,它们存在于内存中而不是在数据库中。这两个表的结构总是与被该触发器作用的表的结构相同。触发器执行完成后,与该触发器相关的这两个表也被删除。 Deleted表存放由于执行Delete或Update语句而要从表中删除的所有行。 Inserted表存放由于执行Insert或Update语句而要向表中插入的所有行。 三:instead of 和 After触发器 SQL Server2000提供了两种触发器:Instead of 和After 触发器。这两种触发器的差别在于他们被激活的同: Instead of触发器用于替代引起触发器执行的T-SQL语句。除表之外,Instead of 触发器也可以用于视图,用来扩展视图可以支持的更新操作。 After触发器在一个Insert,Update或Deleted语句之后执行,进行约束检查等动作都在After触发器被激活之前发生。After触发器只能用于表。

一个表或视图的每一个修改动作(insert,update和delete)都可以有一个instead of 触发器,一个表的每个修改动作都可以有多个After触发器。 四:触发器的执行过程 如果一个Insert﹑update或者delete语句违反了约束,那幺After触发器不会执行,因为对约束的检查是在After触发器被激动之前发生的。所以After 触发器不能超越约束。 Instead of 触发器可以取代激发它的操作来执行。它在Inserted表和Deleted表刚刚建立,其它任何操作还没有发生时被执行。因为Instead of 触发器在约束之前执行,所以它可以对约束进行一些预处理。 五:使用T-SQL语句来创建触发器 基本语句如下: create trigger trigger_name on {table_name | view_name} {for | After | Instead of } [ insert, update,delete ] as sql_statement

SQL触发器实例讲解

SQL触发器实例讲解 2008-11-27 16:16:45| 分类:PROCEDURE | 标签:|字号大中小订阅 SQL触发器实例1 定义:何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序。触发器是一个特殊的存储过程。 常见的触发器有三种:分别应用于Insert , Update , Delete 事件。 我为什么要使用触发器?比如,这么两个表: Create Table Student( --学生表 StudentID int primary key, --学号 .... ) Create Table BorrowRecord( --学生借书记录表 BorrowRecord int identity(1,1), --流水号 StudentID int , --学号 BorrowDate datetime, --借出时间 ReturnDAte Datetime, --归还时间 ... ) 用到的功能有: 1.如果我更改了学生的学号,我希望他的借书记录仍然与这个学生相关(也就是同时更改借书记录表的学号); 2.如果该学生已经毕业,我希望删除他的学号的同时,也删除它的借书记录。 等等。 这时候可以用到触发器。对于1,创建一个Update触发器: Create Trigger truStudent On Student --在Student表中创建触发器 for Update --为什么事件触发 As --事件触发后所要做的事情 if Update(StudentID) begin Update BorrowRecord Set StudentID=i.StudentID

SQL触发器实例讲解

SQL触发器实例讲解 SQL 资料2009-07-23 14:44:07 阅读6072 评论9 字号:大中小订阅 定义:何为触发器?在SQL Serv er里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序。触发器是一个特殊的存储过程。 常见的触发器有三种:分别应用于Insert , Update , Delete 事件。 我为什么要使用触发器?比如,这么两个表: Create Table Student( --学生表 StudentID int primary key, --学号 .... ) Create Table BorrowRecord( --学生借书记录表 BorrowRecord int identity(1,1), --流水号 StudentID int , --学号 BorrowDate datetime, --借出时间 ReturnDAte Datetime, --归还时间 ... ) 用到的功能有: 1.如果我更改了学生的学号,我希望他的借书记录仍然与这个学生相关(也就是同时更改借书记录表的学号); 2.如果该学生已经毕业,我希望删除他的学号的同时,也删除它的借书记录。 等等。 这时候可以用到触发器。对于1,创建一个Update触发器: Create Trigger truStudent On Student --在Student表中创建触发器 f or Update --为什么事件触发 As --事件触发后所要做的事情 if Update(StudentID) begin Update BorrowRecord Set StudentID=i.StudentID From BorrowRecord br , Deleted d ,Inserted i --Deleted和Inserted临时表 Where br.StudentID=d.StudentID end

删除 SQL Server 的实例

删除SQL Server 的特定实例 若要删除SQL Server 的特定实例,请按照下列步骤操作: 1.找到并删除%drive%:\Program Files\Microsoft SQL Server\MSSQL\Binn 文件 夹,其中%drive%是要删除的SQL Server 实例的位置。 2.找到以下注册表项: o HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer 注意:如果要删除默认实例,则必须删除除Client项以外的所有项。 o HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server 必须使用Regedt32.exe 来编辑要删除的实例的InstalledInstances 值。默认实例的显示名称为MSSQLSERVER,而命名实例的显示名称则为给该 实例指定的名称。 注意:不能使用Regedit.exe 编辑该值;您必须使用Regedt32.exe。 注意:如果这是SQL Server 2000 的群集实例,请为群集中的每个节点重复执行这些步骤。 删除SQL Server 的所有已知实例 若要删除SQL Server 的所有已知实例,请按照下列步骤操作: 1.找到并删除%drive%:\Program Files\Microsoft SQL Server\MSSQL\Binn 文件 夹。 2.找到并删除以下注册表项: o HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer o HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server 3.找到并删除以下注册表项: o HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MSSQL Server o HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SQLSER VERAGENT o HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MSSQL ServerADHelper 4.步骤3 中的三个注册表项对应于Microsoft SQL Server 2000 的默认实例。命名实例 对应的注册表项与步骤 3 中列出的注册表项类似,但后面带有$instance_name,因

数据库存储器与触发器实验报告

南昌航空大学实验报告 二0 一七年5月 3 日 课程名称:数据库概论实验名称:存储器与触发器 班级: XX 姓名:XXX 同组人: X 指导教师评定:签名: 一、实验环境 1. Windows2000或以上版本; 2. SQLServer2000 或2005。 二、实验目的 1. 掌握存储过程的创建,修改,使用,删除; 2. 掌握触发器的创建,修改,使用,删除。 三、实验步骤及参考源代码 1.创建过程代码: CREATEPROCEDURE_P_Proc( @ccna varchar (10), @cnochar(4) OUTPUT@cnavarchar (10) OUTPUT@Pna varchar (20) OUTPUTSnumint OUTPUT AS SELECT@cna=cna, @cn(=cp. eno, @pnapna, @numnum FROMtp , customer, paper WHEREustomer . eno=cp. eno ANRaper . pno=cp. pno ANDcna =@ccna

6.执行存储过程C_P_Pro,实现对李涛,钱金浩等不同顾客的订阅信息 查询 execute C_P_Proc @nam=e' 李涛' execute C_P_Proc @nam=e' 钱金浩' 7,删除存储过程C_P_Prcc DROPPROCEDURCE_P_PROC (4)在DingBao数据库中针对PAPEF创建插入触发器TR_PAPER_I删除触发器TR_PAPER_D修改触发器TR_PAPER。具体要求如下。 <1>对PAPER勺插入触发器:插入报纸记录,单价为负值或为空时,设定为10 元。 CREATE TRIGGER TR_PAPER_I ON paper FOR INSERT AS DECLARE @ippr FLOAT; declare @ipno int; SELECT @ippr=ppr,@ipno=pno from inserted begin if @ippr<0 or @ippr is NULL begin raiserror(' 报纸的单价为空或小于零!',16,1)

SqlServer触发器的原理及案例

SqlServer触发器的原理及案例合理的选用触发器会让你的系统更高效 2010 Ssc

目录 第1章何为触发器 (3) 1.1 触发器的'本质' (3) 1.2 这样做带来的'功能': (3) 1.3 触发器的作用 (3) 1.4 说明: (3) 第2章对触发器3种操作的分析 (4) 2.1 创建触发器 (4) 2.2 学习案例 (5) 2.2.1 建立表 (5) 2.2.2 触发器练习1 (5) 2.2.3 触发器练习2: (6) 第3章图形化操作触发器 (7) 3.1 查看触发器情况 (7) 第4章触发器中的变量操作 (11) 第5章SQL触发器语法参考 (11)

第1章何为触发器 1.1触发器的'本质' 触发器是一种特殊的存储过程,它不能被显式地调用,而是在往表中插入记录、更改记录或者删除记录时,当事件发生时,才被自动地激活。 1.2这样做带来的'功能': 触发器可以用来对表实施复杂的完整性约束,保持数据的一致性,当触发器所保护的数据发生改变时,触发器会自动被激活,响应同时执行一定的操作(对其它相关表的操作),从而保证对数据的不完整性约束或不正确的修改。触发器可以查询其它表,同时也可以执行复杂的T-SQL语句。触发器和引发触发器执行的命令被当作一次事务处理,因此就具备了事务的所有特征。 注意:'事务具备什么特征?在触发器中的作用?' 如果发现引起触发器执行的T-SQL语句执行了一个非法操作,比如关于其它表的相关性操作,发现数据丢失或需调用的数据不存在,那么就回滚到该事件执行前的SQL SERVER数据库状态。 1.3触发器的作用 触发器可以对数据库进行级联修改,这一点刚才已经说过了。需要说明的是:'触发器和约束的关系和区别' (1)一般来说,使用约束比使用触发器效率更高。 (2)同时,触发器可以完成比CHECK约束更复杂的限制。 1.4说明: 1.与CHECK约束不同,在触发器中可以引用其它的表。 2.触发器可以发现改变前后表中数据的不一致,并根据这些不同来进行相应的操作。

SQL触发器实例

--建立触发器,显示修改人数 create trigger d1 on jun for insert,update as select '你正在修改数据' declare @a varchar(20) select @a=str(@@rowcount)+'个学生被修改' select @a select * from jun return insert into jun(爱好) values('跑步') update jun set 爱好='打球' where 学号<='103' --建立触发器,当男生人数在6个以内可以加入,否则不能加入 create trigger i1 on zg for insert as if((select count(性别) from zg where 性别='男')>6) select '不能插入,男生人数已满。' else select'插入成功' select * from zg insert into zg(学号,姓名,性别) values(20100636,'江渝','男') --建立触发器,如果语文成绩在200以内可以修改,否则不能修改 create trigger u1 on zg for update as if((select max(语文) from zg )>200) begin select '你不能修改' rollback end else select '修改成功' select * from zg update zg set 语文=语文+10 where 姓名='唐荣强' update zg set 语文=语文-20 where 姓名='张军' update zg set 语文=语文+30 where 姓名='张军'

数据库触发器机制的设计与实现

数据库触发器机制的设计与实现 摘要:根据当前数据库应用需求和技术发展现状,研究了数据库管理系统管理系统触发器机制实现的关键技术问题,并以GKD-BaseGKD-Base为原型,在已有的GKD-Base PL/SQL 引擎基础上实现了数据库的触发器功能。关键词: PL/SQL引擎 Rete网络双Hash结构触发器 数据库管理系统作为信息系统的核心部件,在信息化时代所充当的角色是其它任何软件所不能替代的。当前数据库应用的一个普遍要求是数据库管理系统能够在一些数据库相关事件发生时触发预先定义的操作,实现信息管理的自动化,因此引进了触发器机制。触发器可以增强引用完整性,加强复杂业务的规则,或者监控数据库的变动,并执行一定的数据操作。触发器机制实现主要涉及触发事件的检测以及触发条件的判决等关键技术问题,以及对触发器的编译存储和调用执行等具体操作。本文以国产数据库管理系统GKD-Base为原型,在兼容Oracle 规范的PL/SQL引擎基础上,提出一套解决方案,对触发器的关键技术问题进行了探讨,并设计实现了数据库的触发器机制,扩展了数据库管理系统GKD-Base的功能。1 GKD-Base PL/SQL 引擎GKD-BASE数据库是一个具有自主知识产权的数据库管理系统,具有兼容SQL89标准的SQL引擎,能够为用户提供一个统一、有效的数据库访问接口(XAPI),实现对数据库的各种操作。为了融合SQL语言强大的集合数据处理能力处理能力和第三代语言(3GL)灵活的过程处理能力,在GKD-Base上已初步实现了兼容Oarcle PL/SQL V.23的PL/SQL引擎。GKD-Base PL/SQL引擎包括编译器、解释器和异常处理三个模块。在编译阶段,根据PL/SQL语言兼有过程式语句和SQL语句的特点,采取分而治之策略,把过程语句和SQL语句分开处理。对于SQL语句,编译器首先建立SQL语句结点,进行相应的变量绑定和语法检查;检查无误后产生语法树形式的中间代码。对于过程语句,编译器将对语句成分进行语法分析,对声明的变量和数据类型建立相应的符号表,最终产生语法树形式的中间代码。解释器的作用是对编译器生成的中间代码进行解释执行。解释器与编译器对应,具有相对独立的SQL语句解释模块和过程语句解释模块。另外,解释器还包括执行状态堆栈的管理、与GKD-Base SQL引擎的调用接口。异常处理模块主要实现程序运行时的错误检查和报告,并支持用户自定义异常和预定义异常的检查和处理。GKD-Base PL/SQL引擎可以实现对过程式语句、SQL语句与游标、存储子程序及包的编译和解释执行。2 触发器实现的关键问题触发器定义了当某些数据库相关事件发生时数据库应采取的动作。触发器可增强引用完整性,加强复杂业务的规则,或者监控数据库的变动,其实现主要涉及到触发事件的检测以及触发条件的判决等关键技术问题。2.1 触发器的事件检测机制触发器事件检测机制包括对事件的检测和存储,是实现触发器的关键。触发器检测的事件类型比较简单,基本事件主要包括对数据的插入、删除以及更新等。GKD-Base的触发器在对事件检测时,直接在相关事件发生的前后调用检测函数截获并分析事件消息,以确定是否对触发器点火。触发器事件检测机制实现的关键在于对触发事件的存储。触发事件具有时间顺序,因此存储时也必须按照严格的时间顺序进行存储。综合比较各个商用和实验数据库系统的事件表存储机制,选择了Starburst的双的双HASH链表存储机制,如图1。 这里,变迁表分为两种类型:NEW和OLD,分别对应于触发器行级别操作中的NEW值和OLD值。变迁表中存储了事件类型、当前数据表以及事件作用的元组。系统可以通过这个驻留内存的双HASH链表实现数据库变迁的快速定位和跟踪处理。2.2 触发器的条件判决机制触发器的条件判决机制是触发器的核心,根据SQL99标准的定义,可以将触发器分为前触发、约束判定和后触发三种类型。这三种类型触发器的判决顺序策略如图2。 触发器的条件评估是影响触发器机制的最关键因素。在数据库环境中,大多数数据修改行为只能影响数据库的一小部分内容,因此没必要每次都从头开始评估触发器规则条件,Rete

SQL游标及触发器实例

SQL Code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 Declare @barCode varchar(50)--声明变量用于存放游标结果 DECLARE CsrName CURSOR FOR--声明游标 select barCode from eachBook --游标数据来源 BEGIN OPEN CsrName --打开游标 FETCH FROM CURSUBOK INTO @barCode--获得来源的一行记录放入变量 WHILE @@FETCH_STATUS = 0 BEGIN -----------------------------------------------------针对每个结果做的操作 print @barcode ----------------------------------------------------------------------------End FETCH NEXT FROM CsrName INTO @barCode --处理下一行数据 CLOSE CsrName --游标用完了要关掉 END 总结:一般sql语句是面向集合的,游标是面向集合里面的行的,相当于获取一行数据->处理->获得下一行数据->处理这样一个循环。能不用游标就尽量不要用游标,性能很烂 --两种触发器,after为表sql语句执行之后操作,INSTEAD OF为之前操作 create trigger tgr_name--创建触发器 on classes --在classes表上 for insert--当classes表插入数据是触发as里面的操作(for 有after默认值,所以是sql 语句执行完了执行) --,有insert、update、delete三种操作类型。 as declare @id int;--定义变量用来临时存放数据 select @id = id from inserted; --在inserted表中查询已经插入记录信息,update就有个updated表,deleted就是deleted表 print '刚刚插入的记录的ID是'+@id; GO

数据库建立触发器

江西理工大学应用科学学院 数据库技术及应用实验报告 实验名称SQL数据库存储过程及触发器的创建 日期2012、4、2 专业班级电子商务091班 实验人阳东学号40号 实验要求: 1、用T-SQL语言创建名为查看课程成绩的存储过程: 输入任一课程名,则显示课程、编号、名称、教师编号、学生的学号以及 对应课程成绩。 2、用T-SQL语言创建触发器: 当对表插入数据时,性别只为男or女,否则弹出错误提示框。 实验目的: 学会使用T-SQL语言创建数据库存储过程以及触发器。 实验内容及步骤: 一、创建存储过程: 1、启动SQL Server企业管理器。 2、在“控制台根目录”窗口左边窗格中,展开“SQL Server组”→“数据库” 结点,然后建立“英才大学信息管理系统”数据库。 3、在数据库中建立相应的表“课程名、成绩表”,并在两个表中键入相应的 内容。 4、选择“朱虹美”数据库,然后点击工具中的“SQL查询分析器”菜单命令 ,进入“查询分析器”窗口。 5、在“查询分析器”窗口,输入并执行如下命令: CREATE PROC 查看课程成绩@课程名char(12) AS SELECT 课程.课程编号,课程.课程名称,课程.教师编号,成绩.学号,成绩.成绩 FROM 课程INNER JOIN 成绩ON 课程.课程编号=成绩.课程编号 WHERE 课程.课程名称=@课程名 结果如图所示: 然后再次进入“查询分析器”窗口,执行存储过程,有三种方法: 1)EXEC 查看课程成绩@课程名='软件工程' 2)EXEC 查看课程成绩数据库原理

3) Declare @X char(12) EXEC @X=查看课程成绩'程序设计' 二、创建触发器。 1、启动SQL Server企业管理器。 2、在“控制台根目录”窗口左边窗格中,展开“SQL Server组”→“数据库” 结点,点击“英才大学信息管理系统”数据库。 3、在数据库中建立相应的表“学生”,并在表中键入相应的内容。 4、选择“英才大学信息管理系统”数据库,然后点击工具中的“SQL查询分析器” 菜单命令进入“查询分析器”窗口。 5、在“查询分析器”窗口,输入并执行如下命令: CREATE TRIGGER Trigger_学生_性别ON 学生 FOR INSERT AS IF EXISTS(SELECT*FROM 学生WHERE 性别NOT IN('男','女')) BEGIN RAISERROR('请输入合法的姓名!',16,1) ROLLBACK TRANSACTION END 建立触发器完毕。 然后在表中添加不符合规格的数据,则显示错误提示框:

数据库触发器的分类和区别

Oracle触发器的分类和使用 摘要:在Oracle中,触发器是一种特殊的存储过程,它在发生某种数据库事件时由Oracle 系统自动触发。触发器通常用于加强数据的完整性约束和业务规则等,对于表来说,触发器可以实现比CHECK约束更为复杂的约束。本文介绍了Oracle触发器的概念,功能,优缺点,组成等方面。详细解读了Oracle触发器在各方面的应用并配合相关实例。 关键字:Oracle、触发器、介绍、应用 一、触发器的介绍 1.1 触发器的概念 在Oracle中,触发器是一种特殊的存储过程,它在发生某种数据库事件时由Oracle系统自动触发发器,通常用于加强数据的完整性约束和业务规则等。 触发器与存储过程的区别在于:存储过程是由用户或应用程序显式调用的,而触发器是不能被直接调用的,而是由一个事件来启动运行。即触发器是当某个时间发生时自动地隐式运行。 1.2 触发器的功能 ●允许/限制对表的修改 ●自动生成派生列,比如自增字段 ●强制数据一致性 ●提供审计和日志记录 ●防止无效的事务处理 ●启用复杂的业务逻辑 1.3 触发器的优缺点 优点:触发器可通过数据库中的相关表实现级联更改,不过,通过级联引用完整性约束可以更有效地执行这些更改。触发器可以强制比用CHECK 约束定义的约束更为复杂的约束。与CHECK 约束不同,触发器可以引用其它表中的列。例如,触发器可以使用另一个表中的SELECT 比较插入或更新的数据,以及执行其它操作,如修改数据或显示用户定义错误信息。触发器也可以评估数据修改前后的表状态,并根据其差异采取对策。一个表中的多个同类触发器(INSERT、UPDA TE 或DELETE)允许采取多个不同的对策以响应同一个修改语句。 缺点:触发器功能强大,轻松可靠地实现许多复杂的功能,但是它也具有一些缺点那就是由于我们的滥用会造成数据库及应用程序的维护困难。在数据库操作中,我们可以通过关系、触发器、存储过程、应用程序等来实现数据操作。同时规则、约束、缺省值也是保证数据完整性的重要保障。如果我们对触发器过分的依赖,势必影响数据库的结构,同时增加了维护的复杂程序。 1.4 触发器的组成

SQL_Server数据库设计的案例分析

数据库设计的案例分析 一、教学管理 1. 基本需求 某学校设计学生教学管理系统。学生实体包括学号、姓名、性别、生日、民族、籍贯、简历、登记照,每名学生选择一个主修专业,专业包括专业编号和名称,一个专业属于一个学院,一个学院可以有若干个专业。学院信息要存储学院号、学院名、院长。教学管理还要管理课程表和学生成绩。课程表包括课程号、课程名、学分,每门课程由一个学院开设。学生选修的每门课程获得一个成绩。 设计该教学管理的ER模型,然后转化为关系模型。 若上面的管理系统还要管理教师教学安排,教师包括编号、姓名、年龄、职称,一个教师只能属于一个学院,一名教师可以上若干门课程,一门课程可以有多名老师来上,每个教师所上的每门课都有一个课堂号和课时数。试修改上题的ER模型,将教师教学信息管理增加进去。

2. 参考设计: 图一教学管理ER图 由ER模型转换的关系模型是: 学生(学号,姓名,性别,生日,民族,籍贯,专业号,简历,登记照)专业(专业号,专业,专业类别,学院号) 学院(学院号,学院,院长) 课程(课程号,课程名,学分,学院号) 成绩(学号,课程号,成绩) (题目分析:本题中有学生、专业、学院、课程四个实体。一个学生只有一个主修专业,学生与专业有多对一的联系;一个专业只由一个学院开设,一门课程只由一个学院开设,学院与专业、学院与课程都是一对多的联系;学生与课程有多对多的联系。 在转换为关系模型时,一对多的联系都在相应的多方实体的关系中增加一个外键。) 增加教师,ER图如下。

图二有教师实体的教学管理ER图 3. 物理设计 基于Access的数据库结构设计如下。 指定数据库文件的名称,并为设计好的关系模型设计表结构。 数据库文件保存在“E:\教学管理\”文件夹中,数据库文件名:教学管理.MDB。 表包括:学院、专业、学生、课程、成绩单。对应表结构如表1-2至表1-6所示。 表1-1 学院 表1-2 专业 表1-3 学生

SqlServer触发器的原理及案例

触发器 ?触发器是一种特殊类型的存储过程,它在指定的表中的数据发生变化(INSERT、 UPDATE 或DELETE)时自动执行 ?触发器可以查询其它表,并可以包含复杂的Transact-SQL 语句 ?主要用于强制复杂的业务规则或要求 优点 ?自动执行 ?实现相关表层叠修改,实现多个表之间数据的一致性和完整性 ?实现比check约束更复杂的限制,可以引用其他表中的列 触发器的类型 ?AFTER触发器:在数据变动(INSERT、UPDATE、DELETE操作)完成后激发,只能在表 上定义,同一个表中可以有多个AFTER触发器 ?INSTEAD OF触发器:在数据变动以前被激发,并取代变动数据(INSERT、UPDATE、 DELETE操作),转而去执行触发器定义的操作,可以定义在表或视图上,每个update、insert和delete语句最多可以定义一个INSTEAD OF触发器。 创建触发器 ?CREATE TRIGGER trigger_name ON { table | view } [ WITH ENCRYPTION ] { { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] [, ][DELETE]} AS sql_statement [...n ] } 触发器示例: ?CREATE TRIGGER reminder ON titles FOR INSERT, UPDATE AS RAISERROR (50009, 16, 10) 指定触发器何时激发 ?AFTER 触发器在触发操作(INSERT、UPDATE 或DELETE)后和处理完任何约束后激 发。可通过指定AFTER 或FOR 关键字来请求AFTER 触发器。 ?INSTEAD OF 触发器代替触发动作进行激发,并在处理约束之前激发。 ?对于每个触发操作(UPDATE、DELETE 和INSERT),每个表或视图只能有一个 INSTEAD OF 触发器。而一个表对于每个触发操作可以有多个AFTER 触发器。 触发器示例: create TRIGGER reminder ON titles FOR INSERT, delete,update AS --修改操作 if (select count(*) from inserted) > 0 and (select count(*) from deleted) >0 begin RAISERROR ('修改成功', 16, 10) end

SQLServer-触发器使用实例

SQLServer-触发器使用实例

SQLServer 触发器使用实例 触发器是一个特殊的存储过程。 常见的有三种:分别应用于Insert , Update , Delete 事件。 一、Trigger语法: create trigger tr_name on table/view {for | after | instead of } [update][,][insert][,][delete] [with encryption] as {batch | if update (col_name) [{and|or} update (col_name)] } 说明: 1 tr_name :名称 2 on table/view :触发器所作用的表。一个触发器只能作用于一个表 3 for 和after :同义 4 after 与instead of :sql 2000新增项目afrer 与 instead of 的区别 After 在触发事件发生以后才被激活,只可以建立在表上 Instead of 代替了相应的触发事件而被执行,既可以建立在表上也可以建立在视图上

5 insert、update、delete:激活触发器的三种操作,可以同时执行,也可选其一 6 if update (col_name):表明所作的操作对指定列是否有影响,有影响,则激活触发器。此外,因为delete 操作只对行有影响, 所以如果使用delete操作就不能用这条语句了(虽然使用也不出错,但是不能激活触发器,没意义)。 7 触发器执行时用到的两个特殊表:deleted ,inserted deleted 和inserted 可以说是一种特殊的临时表,是在进行激活触发器时由系统自动生成的,其结构与触发器作用的表结构是一 样的,只是存放的数据有差异。 二、实例: 实例1(注意这里的关联,条件是如何关联,update中set的值是与谁关联。这些都可以从【触发器的两个临时表:inserted、deleted】中得到答案) 比如,这么两个表: Create Table Student( --学生表 StudentID int primary key, --学号 StudentName varchar(50),姓名 ) Create Table BorrowRecord( --学生借书记录表 BorrowRecord int identity(1,1), --流水号

数据库触发器的应用实例

8.5 数据库触发器的应用举例 例1:创建一个DML语句级触发器,当对emp表执行INSERT, UPDATE, DELETE 操作时,它自动更新dept_summary 表中的数据。由于在PL/SQL块中不能直接调用DDL语句,所以,利用ORACLE内置包DBMS_UTILITY中的EXEC_DDL_STATEMENT过程,由它执行DDL语句创建触发器。 CREATE TABLE dept_summary( Deptno NUMBER(2), Sal_sum NUMBER(9, 2), Emp_count NUMBER); INSERT INTO dept_summary(deptno, sal_sum, emp_count) SELECT deptno, SUM(sal), COUNT(*) FROM emp GROUP BY deptno; --创建一个PL/SQL过程disp_dept_summary --在触发器中调用该过程显示dept_summary标中的数据。 CREATE OR REPLACE PROCEDURE disp_dept_summary IS Rec dept_summary%ROWTYPE; CURSOR c1 IS SELECT * FROM dept_summary; BEGIN OPEN c1; FETCH c1 INTO REC; DBMS_OUTPUT.PUT_LINE('deptno sal_sum emp_count'); DBMS_OUTPUT.PUT_LINE('-------------------------------------'); WHILE c1%FOUND LOOP DBMS_OUTPUT.PUT_LINE(RPAD(rec.deptno, 6)|| To_char(rec.sal_sum, '$999,999.99')|| LPAD(rec.emp_count, 13)); FETCH c1 INTO rec; END LOOP; CLOSE c1; END; BEGIN DBMS_OUTPUT.PUT_LINE('插入前'); Disp_dept_summary(); DBMS_UTILITY.EXEC_DDL_STATEMENT(' CREATE OR REPLACE TRIGGER trig1 AFTER INSERT OR DELETE OR UPDATE OF sal ON emp BEGIN DBMS_OUTPUT.PUT_LINE(''正在执行trig1 触发器…''); DELETE FROM dept_summary;

sqlserver 触发器示例

sqlserver 触发器示例 1--检查当前触发器是否已存在 2IF exists(SELECT*FROM sysobjects WHERE xtype='TR'AND [name]='TR_INSERTUserInfo_LoginLog') 3--存在即删除该触发器 4DROP TRIGGER TR_INSERTUserInfo_LoginLog 5go 6--触发器创建在UserInfo表上当对UserInfo表执行INSERT操作后自动执行触发器中的SQL语句 7CREATE TRIGGER TR_INSERTUserInfo_LoginLog 8ON UserInfo 9FOR INSERT 10AS 11BEGIN 12--定义接受新建用户ID的参数 13DECLARE@userID VARCHAR(50); 14--查询INSERTED临时表获取新建用户ID 15SELECT@userID=UserID FROM Inserted 16--向用户登录日志表中添加新建用户登录日志 17INSERT INTO LoginLog VALUES(@userID,getDate()) 18END 19GO 20 21IF EXISTS(SELECT*FROM sysobjects WHERE xtype='TR'AND [name]='TR_Update_UserInfo_ManagerLog') 22DROP TRIGGER TR_Update_UserInfo_ManagerLog 23GO 24CREATE TRIGGER TR_Update_UserInfo_ManagerLog 25ON UserInfo 26FOR UPDATE 27AS 28--接受被更新用户信息的ID

相关文档
最新文档