文档库 最新最全的文档下载
当前位置:文档库 › 课题_浅谈SQL Server 数据库之触发器

课题_浅谈SQL Server 数据库之触发器

课题_浅谈SQL Server 数据库之触发器
课题_浅谈SQL Server 数据库之触发器

浅谈SQL Server 数据库之触发器

触发器的特征:

1、触发器是在对表进行增、删、改时,自动执行的存储过程。触发器常用于强制业务规则,它是一种高级约束,通过事件进行触发而被执行。

2、触发器是一个特殊的事务单元,可以引用其他表中的列执行特殊的业务规则或数据逻辑关系。当出现错误时,可以执行rollback transaction操作将整个触发器以及触发它的T-SQL语句一并回滚(不需显示声明begin transaction)。

3、每个触发器将用到的两个临时表:

deleted 临时表:用于临时存放被删除的记录行副本(包括delete和update语句所影响的数据行);

注意:被删除的记录行,首先从原始表中删除,并保存到触发器表。然后从触发器表中删除,再保存到deleted表。

inserted临时表:用于临时存放插入的记录行副本(包括insert和update语句所影响的数据行);

deleted表和inserted表的特征:

> 这两个表的表结构与该触发器作用的表相同;

> 这两个表是逻辑表,并且由系统管理;

> 这两个表是动态驻留在内存中的(不是存储在数据库中),当触发器工作完成后,它们也被删除;

> 这两个表是只读的,即只能运用select语句查看(用户不能直接更改);

4、所创建的触发器(insert、delete、update)是在原表数据行已经修改完成后再触发。所以,触发器是在约束检查之后才执行。

什么时候使用触发器?

a、实现主外键关系所不能保证的复杂参照完整性和数据的一致性。

不过,通过“级联引用完整性约束”可以更有效地执行这些更改。

b、防止恶意或错误的INSERT、UPDATE 以及DELETE 操作,并强制执行比CHECK 约束定义的限制更为复杂的其他限制。

> 与CHECK 约束不同(check约束只能引用自身表中的列),DML触发器可以引用其他表中的列;

> 触发器可以完成所有约束的功能,但不一定是最佳方案;

> 触发器能够使用自定义信息和较为复杂的错误处理;

c、DML 触发器可以评估数据修改前后表的状态,并根据该差异采取措施。

d、一个表中的同一个修改语句的DML触发器,允许被多个不同的操作(INSERT、UPDATE 或DELETE)来响应;

触发器的类型:

insert 触发器;(略)

delete 触发器;(略)

update 触发器:在修改表中记录行或某列数据时触发执行;

注意:update(列)函数:实现检测某列是否被修改。

update 更新操作分为两步:

首先,“删除”更改前原有数据行:删除的原有数据行将复制到deleted临时表中;

然后,“插入”更改后的新数据行:插入新数据行到原始表,同时将新数据行保存到inserted临时表和触发器表中;

创建触发器的注意点:

1、create trigger必须是批处理(go)的第一条语句;

2、一个触发器语句只能用到一个表或一个视图中;

on 表名/ 视图名

3、一个触发器语句可以执行多个操作;

for delete,insert,update -- 无先后顺序的任意组合

4、建议DML触发器不返回任何结果。这是因为对这些返回结果的特殊处理必须写入每个允许对触发器表进行修改的应用程序中。

若要防止从DML 触发器返回任何结果,请不要在触发器定义中包含select语句或变量赋值;

如果必须在触发器中进行变量赋值,则应该在触发器被触发之前使用set nocount on语句以避免返回任何结果集;

注意:未来版本的SQL Server 中,将会删除从触发器返回结果集的功能。

5、如果“触发器表”本身也存在约束,则在执行insert、delete、update触发器前,首先会检查“触发器表”上存在的约束。如果不满足约束,则不会执行其insert、delete、update触发器。

查看当前数据库中的所有触发器

select*from sys.triggers

创建临时表#tableName

create table #tableName

如何使用SQL Server 触发器

触发器2_初始化环境SQL

--------------- 初始化环境 ---------------

create database TriggerDatabase

use TriggerDatabase

go

if exists(select*from sysobjects where name='bank')

drop table bank

create table bank -- 账户信息表

(

userName varchar(10) not null, --顾客名

cardID varchar(10) not null, --卡号

currentMoney money not null--当前余额

)

if exists(select*from sysobjects where name='transInfo')

drop table transInfo

create table transInfo --交易信息表

(

cardID varchar(10) not null, --卡号

transType char(4) not null, --交易类型(存入/支取)

transMoney money not null, --交易金额

transDate datetime not null--交易日期

)

go

--------------- 添加约束 ---------------

alter table bank

add constraint CK_currentMoney check(currentMoney>=1);

alter table transInfo

add constraint DF_transDate default(getdate()) for transDate;

alter table transInfo

add constraint CK_transType check(transType in('支取','存入'));

--------------- 添加测试数据 ---------------

/* 张三 1000元 */

insert into bank(userName,cardID,currentMoney)

values('张三','1001 0001',1000);

/* 李四 1元 */

insert into bank(userName,cardID,currentMoney)

values('李四','1001 0002',1);

/* 张三支取 200元 */

insert into transInfo(cardID,transType,transMoney)

values('1001 0001','支取',200);

--------------- 查看结果 ---------------

select*from bank;

select*from transInfo;

go

触发器3_定义触发器的格式

-- ============================================= -- Author: xugang

-- Create date: 2010-2-14

-- Description: 定义触发器的精简格式

-- [ ]:可选 { }必选

-- =============================================

create trigger[ schema_name. ]-- 触发器所属架构

trigger_name -- 触发器名称

on { table|view } -- 触发器的表或视图

[ with encryption ]-- 加密dml触发器定义(后面详解)

{ for| after }

/* after:只有在触发它的SQL语句执行成功后才能激发。 (只能对“表”定义after) */

{ insert,update,delete }

as

/* SQL语句... */

go

--查看当前数据库中的所有触发器

select*from sys.triggers

触发器4_insert 触发器SQL

------------------ insert 触发器 ------------------

use TriggerDatabase

go

if exists(select*from sysobjects

where name='trig_insert_transInfo')

drop trigger trig_insert_transInfo

go

-- create trigger必须是批处理(go)的第一句

create trigger trig_insert_transInfo

on transInfo for insert

as

declare@_transType char(4), --定义变量

@_transMoney money,

@_cardID char(10),

@balance money--所剩余额

-- 从inserted临时表中获取记录值

select@_transType= transType,

@_transMoney= transMoney,

@_cardID= cardID

from inserted

if(@_transType='支取')

update bank set currentMoney=currentMoney-@_transMoney where cardID =@_cardID;

update bank set currentMoney=currentMoney+@_transMoney where cardID =@_cardID;

--显示交易金额

print'交易成功!交易金额:'

+convert(varchar(20),@_transMoney)

--显示所剩余额

select@balance= currentMoney from bank

where cardId =@_cardID

print'卡号:'+@_cardID

+' 余额:'+convert(varchar(20),@balance);

go

------------------ 测试触发器 ------------------

-- delete from transInfo

set nocount on--不显示T-SQL影响的记录行数

insert into transInfo(cardID,transType,transMoney)

values('1001 0001','支取',200);

insert into transInfo(cardID,transType,transMoney)

values('1001 0001','存入',10000);

--查看结果

select*from bank

select*from transInfo

触发器5_delete 触发器SQL

/* 实现: 当清除'交易信息表'的数据时,

自动备份被清除的数据到backupTable表中

*/

------------------ delete 触发器 ------------------

use TriggerDatabase

go

if exists (select*from sysobjects

where name='trig_delete_transInfo')

drop trigger trig_delete_transInfo

go

create trigger trig_delete_transInfo

on transInfo after delete-- for | after

as

print'开始备份数据,请稍后......'

-- 如果数据库中,不存在 backupTable 表

if not exists(select*from sysobjects

where name='backupTable')

select*into backupTable from deleted --deleted临时表else

insert into backupTable select*from deleted

print'备份成功,备份表 backupTable 中的数据为:' select*from backupTable;

go

------------------ 测试触发器 ------------------

set nocount on

delete from transInfo; --测试

--查看结果

select*from transInfo

select*from backupTable

触发器6_update 触发器SQL

------------------ update 触发器 ------------------

use TriggerDatabase

go

if exists (select*from sysobjects

where name='trig_update_bank')

drop trigger trig_update_bank

go

create trigger trig_update_bank

on bank for update--在bank表上创建update触发器as

declare@beforeMoney money,

@afterMoney money,

@currentTrans money--当前交易金额

--从deleted临时表,获取交易前的余额

select@beforeMoney= currentMoney from deleted; --从inserted临时表,获取交易后的余额

select@afterMoney= currentMoney from inserted;

if abs(@afterMoney-@beforeMoney) >2000

begin

print'当前交易金额为:'+

convert(varchar(20),abs(@afterMoney-@beforeMoney)) -- 自定义错误消息

raiserror('每次交易金额不能超过2000元,交易失败!',16,1)

rollback transaction--回滚事务,撤销交易!

/* 注意:

触发器是一个特殊的事务单元

不需显示声明begin transaction

*/

end

go

------------------ 测试触发器 ------------------

set nocount on

--测试1: 在 bank表触发 update触发器

update bank set currentMoney = currentMoney +25000

where cardID ='1001 0001'

--测试2: 通过 transInfo表的 trig_insert_transInfo触发器

-- 间接触发 bank表的 trig_update_bank触发器

insert into transInfo(cardID,transType,transMoney)

values('1001 0001','存入',10000);

--查看结果

select*from bank

select*from transInfo

触发器7_MSDN参考

加密dml触发器定义

若要确保其他用户不能查看触发器定义,可以使用with encryption子句加密dml 触发器。

使用with encryption子句后,触发器定义即以无法读取的格式进行存储。

触发器定义加密后,无法进行解密。且任何人都无法进行查看,包括触发器的所有者和系统管理员。

update() 函数:

可用于确定insert或update语句是否影响表中的特定列。

无论何时为列赋值,该函数都将返回true。

使用if update() 子句示例:

create table testTable(a int null, b int null)

go

create trigger my_trig

on testTable for insert

as

if update(b)

print'列b已被修改!'

go

insert into testTable(b) values(123);

-- drop table testTable

注意:

由于delete 语句无法只对某列进行删除,

因此不能将if update()子句应用于delete 语句。

columns_updated() 函数:

也可用于检查insert或update语句更新了表中的哪些列。此函数使用整数位掩码指定要测试的列。

使用columns_updated() 函数示例:

create table testTable2(a int null, b int null)

go

create trigger my_trig2

on testTable2 for insert

as

if ( columns_updated() &2=2 )

print'列b已被修改!'

go

insert into testTable2(b) values(123);

-- drop table testTable2

SQLSERVER操作命令

SQLSERVER数据库操作 ******操作前,请确定SQL的服务已经开启******** 一:登录进入sql数据库 1、开始---所有程序---Microsoft SQL Server 2005---SQL Server Management Studio Express 2、此时出现“连接到服务器”的对话框, “服务器名称”设置为SQL数据库所在机器的IP地址 “身份验证”设置为SQL Server身份验证或者Windows 身份验证 填写登录名和密码后,点击“连接”按钮,即可进入到SQL数据库操作界面。 二:新建数据库 登录进去后,右击“数据库”,选择—“新建数据库” 设置数据库名称,在下面的选项卡中还可以设置数据库的初始大小,自动增长,路径。 点击确定,一个数据库就建好了。 三:如何备份的数据库文件。 登录进入后,右击相应的需要备份数据库----选择“任务” 目标下的备份到,点击“添加”按钮可以设置备份数据库保存的路径。 四:如何还原备份的数据库文件。(以本地机器为例子) 1、设置服务器名称,点击右边的下拉框的三角,选择“浏览更多…”。 此时出现查找服务器对话框,选择“本地服务器”---点开“数据库引擎”前面 的三角---选中出现的服务器名称—确定。 (注:可以在“网络服务器”选项卡中设置网络服务器) 2、设置身份验证,选择为“windows身份验证” 3、点击连接按钮,进入数据库管理页面 4、右击“数据库”,选择“还原数据库”,出现还原数据库的对话框 还原的目标----目标数据库,这里设置数据库的名字 还原的源----选择“源设备”,在弹出的对话框中点击“添加”按钮,找到所备 份的数据库文件,确定。 5、此时,在还原数据库对话框中会出现所还原的数据库的信息。在前面选中所需还 原的数据库。确定。 6、为刚刚还原的数据库设置相应的用户。 a点开“安全性”---右击“登录名”---新建登录名 b 设置登录名(假如为admin),并设置为SQL Server身份验证,输入密码,去除 “强制实施密码策略”前的勾。 C 找到导入的数据库,右击此数据库----选择“属性”,在选择页中,点击“文件” 设置所有者,点击右边的按钮,选择“浏览”,找到相应的用户(如admin)。确 定。。 7、此时重新以admin的身份进入,就可操作相应的数据库。

数据库原理课程设计实验[创建存储过程与触发器]

存储过程与触发器实验日期和时间: 2016 年 5 月13 日、 星 期五第节 实验室:DJ2-信息管理实验室 班级:学号:姓名: 实验环境: 1.硬件:笔记本电脑 2.软件:SQL Server 2012 实验原理: 存储过程概念:存储过程是事先编好的,存储在数据库中的一组被编译了的T-SQL命令集合,这些命令用来完成对数据库的指定操作。存储过程可以接受用户的输入参数、向客户端返回表格或标量结果和消息、调用数据定义语言(DDL)和数据操作语言(DML)语句,然后返回输入参数。 触发器概念:触发器(trigger)是SQL server 提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作(insert,delete,update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。 实验任务: 此作业成绩得分根据你完成的任务的难度和数量评分,完成后在实验室给老师演示验收,课后提交电子版报告。如额外完成自拟题目应当事先将所拟题目提交给老师或在报告中明确标注题意。

假定有学校的图书馆管理信息系统,可以用于日常管理书库和同学们的借还书工作。以下列出参考的库表情况: 根据管理的业务需求来分析,该管理信息系统的数据库应至少包括如下数据表:(打★号的是必须有的表) 1.★图书现有库存表。作用:记录图书的现有库存情况。至少包括:书号、书名、 作者、简介、类别、价格、出版社、出版日期、现有库存数量、最小库存量、库 存总量、库存位置等。 2.★读者信息表。作用:记录读者信息。至少包括:读者编号、证件类型、证件号 码、姓名、性别、职业(可填写教师、学生、教工、其它……)、所属单位、地 址、联系电话等。 3.★借书记录表。作用:记录借书情况,以及是否归还。至少包括:借阅ID(主 键,可设置为自动编号)、书号、读者编号、借阅数量、借阅日期、是否归还、 管理员编号……等。 4.★还书记录表。作用:记录还书情况。至少包括:还书ID(主键,可设置为自动 编号)、书号、读者编号、归还数量、归还日期、是否超期(超过假设45天为 超期)、超期天数、管理员编号……等。(附:为简化操作,续借可视为归还后 再借)。 5.管理员信息表。作用:记录负责管理书库和借书还书工作的管理员信息。至少包 括:管理员编号、职工编号(在职工档案表中的职工编号)、用户名、密码、管 理员级别等……。 6.职工档案表表。作用:记录职工档案。至少包括: 职工编号、姓名、性别、单 位、职称、职务、出生日期、学历、……其它字段自拟。

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

SQLServer触发器的使用

触发器建立的代码 Create Trigger TG_ProjectName On table1 After Update As Update table2 Set[工程名]=b.工程名 from table2 a,inserted b where a.ProjID=b.ID 关于触发器中Inserted和Deleted的解释。 inserted触发器语句中使用了两种特殊的表:deleted 表和inserted 表。Microsoft? SQL Server 2000 自动创建和管理这些表。可以使用这两个临时的驻留内存的表测试某些数据修改的效果及设置触发器操作的条件;然而,不能直接对表中的数据进行更改。 inserted 和deleted 表主要用于触发器中: ◆扩展表间引用完整性。 ◆在以视图为基础的基表中插入或更新数据。 ◆检查错误并基于错误采取行动。 ◆找到数据修改前后表状态的差异,并基于此差异采取行动。 Deleted 表用于存储DELETE 和UPDATE 语句所影响的行的复本。在执行DELETE 或UPDATE 语句时,行从触发器表中删除,并传输到deleted 表中。Deleted 表和触发器表通常没有相同的行。Inserted 表用于存储INSERT 和UPDATE 语句所影响的行的副本。在一个插入或更新事务处理中,新建行被同时添加到inserted 表和触发器表中。Inserted 表中的行是触发器表中新行的副本。 更新事务类似于在删除之后执行插入;首先旧行被复制到deleted 表中,然后新行被复制到触发器表和inserted 表中。 在设置触发器条件时,应当为引发触发器的操作恰当使用inserted 和deleted 表。虽然在测试INSERT 时引用deleted 表或在测试DELETE 时引用inserted 表不会引起任何错误,但是在这种情形下这些触发器测试表中不会包含任何行。 说明 如果触发器操作取决于一个数据修改所影响的行数,应该为多行数据修改(基于SELECT 语句的INSERT、DELETE 或UPDATE)使用测试(如检查@@ROWCOUNT),然后采取相应的对策。 SQL Server 2000不允许AFTER 触发器引用inserted 和deleted 表中的text、ntext 或image 列;然而,允许INSTEAD OF 触发器引用这些列。有关更多信息,请参见CREATE TRIGGER。 在INSTEAD OF 触发器中使用inserted 和deleted 表 传递到在表上定义的INSTEAD OF 触发器的inserted 和deleted 表遵从与传递到AFTER 触发器的inserted 和deleted 表相同的规则。inserted 和deleted 表的格式与在其上定义INSTEAD OF 触发器的表的格式相同。inserted 和deleted 表中的每一列都直接映射到基表中的列。 有关引用带INSTEAD OF 触发器的表的INSERT 或UPDATE 语句何时必须提供列值的规则与表没有INSTEAD OF 触发器时相同: 不能为计算列或具有timestamp 数据类型的列指定值。 不能为具有IDENTITY 属性的列指定值,除非该列的IDENTITY_INSERT 为ON。当IDENTITY_INSERT 为ON 时,INSERT 语句必须提供一个值。INSERT 语句必须为所有无DEFAULT 约束的NOT NULL 列提供值。 对于除计算列、标识列或timestamp 列以外的任何列,任何允许空值的列或具有DEFAULT 定义的NOT NULL 列的值都是可选的。

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.触发器可以发现改变前后表中数据的不一致,并根据这些不同来进行相应的操作。

数据库原理实验报告S11-数据库触发器的创建

实验11 数据库触发器的建立 实验日期和时间:2014.11.28 实验室:软件工程室 班级:12计科3 学号:20124122 姓名:张翔 实验环境: 1.硬件:内存4.00GB 处理器 2.50Hz 2.软件:Windows 7旗舰版Microsoft SQL Server 2005 实验原理: 1.理解触发器的概念、和一般存储过程的区别、触发器的优点和使用原则。 2.掌握触发器的创建、执行、查看、修改和删除方法。 一、触发器的概念: 触发器是一种特殊类型的存储过程。一般的存储过程通过存储过程名称被直接调用,而触发器主要是通过当某个事件发生时自动被触发执行的。触发器可以用于SQL Server约束、默认值和规则的完整性检查,还可以完成难以用普通约束实现的复杂功能。 当创建数据库对象或在数据表中插入记录、修改记录或者删除记录时,SQL Server就会自动执行触发器所定义的SQL语句,从而确保对数据的处理必须符合由这些SQL语句所定义的规则。触发器和引起触发器执行的SQL语句被当作一次事务处理,如果这次事务未获得成功,SQL Server会自动返回该事务执行前的状态。 使用触发器有以下优点: ?触发器是自动的执行的,。 ?触发器可以通过数据库中的相关表进行层叠更改,如可以在“学生表”中的学号列上创建一个删除触发器,当删除“学生表”的记录时,自动级联删除“成绩表”中的个匹配行。 ?触发器可以强制限制。这些限制比用CHECK约束所定义的更复杂,与CHECK约束不同的是,触发器可以引用其他表中的列。 触发器可以分为DML触发器和DDL触发器两种 ?DDL触发器用于响应各种数据定义语言(DDL) 事件。这些事件主要对应于Transact-SQL 中的CREATE、ALTER 和DROP 语句,以及执行类似DDL 操作的某些系统存储过程。它们用于执行管理任务,并强制影响数据库的业务规则。 ?DML触发器是在用户使用数据操作语言(DML) 事件编辑数据时发生。DML 事件是针对表或视图的INSERT、UPDATE 或DELETE 语句。DML触发器有助于在表或视图中修改数据时强制业务规则,扩展数据完整性。 DML触发器又分为AFTER触发器和INSTEAD OF触发器两种: ?AFTER触发器:这种类型的触发器将在数据变动(INSERT、UPDA TE和DELETE 操作)完成以后才被触发。可以对变动的数据进行检查,如果发现错误,将拒绝接受或回滚变动的数据。AFTER触发器只能在表上定义。在同一个数据表中可以创建多个AFTER触发器。 ?INSTEAD OF触发器:INSTEAD OF触发器将在数据变动以前被触发,并取代变动数据的操作,而去执行触发器定义的操作。INSTEAD OF触发器可以在表或视图上定义。每个INSERT、UPDATE和DELETE语句最多定义一个INSTEAD OF触发器。 二、创建触发器

sqlserver 触发器

SQL Server 触发器创建、删除、修改 推荐揪错烈火学院> 网络编程> SQL SERVER > 阅读文章正文 一﹕触发器是一种特殊的存储过程﹐它不能被显式地调用﹐而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活。所以触发器可以用来实现对表实施复杂的完整性约`束。 二﹕SQL Server为每个触发器都创建了两个专用表﹕Inserted表和Deleted表。这两个表。 一﹕触发器是一种特殊的存储过程﹐它不能被显式地调用﹐而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活。所以触发器可以用来实现对表实施复杂的完整性约`束。 二﹕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语句之后执行﹐进行约束检查等动作都在

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 建立学生表上触发器代码

--⒁在学生成绩表中,显示存在有 85 分以上成绩的课程号,并统计各门课程不及格人数在 10 人以上的课程数量。 SELECT course_id FROM stud_grade WHERE grade>85 GO select count(*) from ( SELECT course_id 课程号,count(course_id) 人数 FROM stud_grade WHERE grade<60 GROUP BY course_id HAVING count(course_id) >=10 ) -(7) 首先显示“计算机工程系”、“计算机网络技术专业”、班全体学生的基本信息,然后再统计“计算机工程系”、“计算机网络技术专业”、班的学生人数。 SELECT substring(stud_id,3,6)专业编号,count(*)人数 FROM stud_info WHERE substring(stud_id,3,6)=( select substring(speccode,3,6)+'02' from dbo.specialty_code where specname='计算机应用技术') --(9)在学生成绩表中,显示最低分大于60,最高分小于80 的stud_id 列。 select stud_id from dbo.stud_grade group by stud_id having max(grade)<80 and min(grade)>60 --(17)显示课程号为“”、课程成绩高于“”课程的学生的课程名、学号和姓名,并按成绩从高到低次序排列。 select course_name,g1.stud_id,g1.[name] from dbo.lesson_info,dbo.stud_grade as g1,dbo.stud_grade as g2 where dbo.lesson_info.course_id=g1.course_id and g1.stud_id=g2.stud_id and g1.course_id='0401010103' and g2.course_id='0401010104'and g1.grade>g2.grade order by g1.grade

陶宏才《数据库原理和设计》第3版课后习题答案解析教学内容

陶宏才《数据库原理和设计》第3版课后习题答案解析

第一章 一、解答题 1、解释术语:数据、数据库、数据管理系统、数据库系统、数据库应用系统、视图、数据字典。P19-20 数据:是描述现实世界中各种具体事物或抽象概念的、可存储并具有明确意义的信息。 数据库:是相互关联的数据集合。 数据管理系统:是一个通用的软件系统,由一组计算机程序构成。 数据库系统:是一个用户的应用系统得以顺利运行的环境。 数据库应用系统:主要指实现业务逻辑的应用程序。 视图:指不同的用户对同一数据库的每一种理解称为视图。 数据字典:用于存储数据库的一些说明信息的特殊文件。 2、简述数据抽象、数据模型及数据模式之间的关系 P26 数据模型是数据抽象的工具,是数据组织和表示的方式; 数据模式是数据抽象利用数据模型,将数据组织起来后得到的结果; 总而言之,数据模式是数据抽象的结果。 3、DBMS应具备的基本功能有哪些?P9 数据独立性、安全性、完整性、故障恢复、并发控制 4、数据库中对数据最基本的4种操作是什么? P24 增加、删除、修改、查询 5、评价数据模型的3个要素是什么? P12 1)能够真实地描述现实系统 2)能够容易为业务用户所理解 3)能够容易被计算机实现 6、数据模型的3个要素是什么? P24 数据结构、数据操作、数据约束 7、简述SQL语言的使用方式。P13 一般有两种方式:SQL的交互式使用;用户通过开发应用系统与RDBMS交互。 8、在数据库设计时,为什么涉及到多种数据模型?P12 因为目前商用化DBMS没有一个能够同时满足3项要求,为此,人们不得不走折中路线,设计一些中间的数据模型。 9、数据库系统中的用户类型有哪些?P28-29 最终用户、数据库应用开发人员、数据库管理员、其他与数据库系统有关的人员。 11、简述OLTP与OLAP间的区别。P42-43 OLTP(联机事务处理)主要面向日常的业务数据管理,完成用户的事务处理,提高业务处理效率,通常要进行大量的更新操作,同时对响应时间要求比较高。 OLAP(联机分析处理)注重数据分析,主要对用户当前及历史数据进行分析,辅助领导决策,通常要进行大量的查询操作,对时间的要求不太严格。 二、单项选择题 1、( A )不是SQL语言的标准。P156 A.SQL-84 B.SQL-86 C.SQL-89 D.SQL-92 2、 ( D )数据模型没有被商用DBMS实现。P26

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

数据库原理与应用试题--含答案

一、判断题 [数据库系统概论]2 (F)与用文件系统来管理数据相比,用数据库管理数据增加了数据冗余度。 (F)一个信息只能用一种数据形式来表示。 (F)数据库系统是数据库管理系统的重要组成部分。 (F)数据库的三级模式是概念模型、逻辑模型和物理模型。 (F)E-R模型只能转换为关系模型,不能转换为层次模型和网状模型。 (F)如果一个实体A对应多个实体B,则A与B之间必然是一对多的联系。 [关系型数据库基本原理]2 (F)一个关系的主键只能包含一个属性。 (F)在实体-联系模型中,实体具有属性,联系不能具有属性。 (F)关系运算中,选择运算是从列的角度进行的运算,投影运算是从行的角度进行的运算。 (F)在一个关系模式中,如果A->B,B->C,则称C部分依赖于A。 (F)E-R图转换为关系模型时,实体可转换为关系模式,联系不能转换为关系模式。 (F)E-R图转换为关系模式时,所有的联系都必须转换为独立的关系模式。 [数据库的管理]1 (F)数据库的文件包括数据文件、事务日志文件和索引文件。 (F)数据库的一个数据文件可以属于多个文件组。 (F)在SQL Server中,数据库的主数据文件的扩展名是ldf。 [表的管理]2 (F)创建一个表时,对于表的每一列,必须指明数据类型和长度,例如“生日datetime(8)”。

(T)在SQL Server中,nchar数据类型与nvarchar数据类型的区别是,前者是固定长度的,后者是可变长度的。 (T)在SQL Server中,存储逻辑型数据值的数据类型是bit. (F)SQL中的数据定义语言(DDL)用于实现数据增、删、改、查等数据操作。 (F)对于逻辑型的属性,赋值是只能写“YES”或“NO”。 (T)在SQL语句中,对一个字符型的属性赋值,应该两边用单引号将值包括起来。 [数据查询]1 (F)关系型数据库的连接查询有内连接和外连接之分,内连接只能实现两个表的查询,外连接可以实现多个表的查询。 (F)在SELECT语句的WHERE子句部分,不能再使用SELECT语句。 (T)在进行分组统计时,如果需要对分组进行筛选,应使用HAVING语句而不是WHERE语句。 [索引与视图]2 (F)为了提高数据库的检索和更新速度,最好在数据表的每个字段都建立索引。 (F)聚集索引一定是唯一性索引,非聚集索引一定是非唯一性索引。 (T)主键索引必然是唯一索引。 (F)视图一旦创建,就存储了数据。 (F)视图只能用来查看数据,不能在视图上进行数据更新。 (F)视图只能用来查看一个基本表的数据,相当于在一个基本表上的投影与选择。 [数据完整性]1 (F)数据完整性有3种类型:实体完整性、参照完整性、更新完整性。 (F)外键约束定义了表与表之间的关系,用于保证实体完整性。

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), --流水号 StudentID int , --学号 BorrowDate datetime, --借出时间

数据库原理游标及触发器实验

《数据库原理》实验报告要求 报告的主要内容 一、实验目的 根据各实验项目的实验目的撰写,具体在附件中给出。 二、实验环境 操作系统:Windows XP,数据库管理系统(DBMS):SQL Server2008 三、实验要求 根据各实验项目要求撰写,具体在附件中给出。 四、实验内容及完成情况 自己所完成的内容,进行了哪些操作、编写了哪些程序及执行后的结果,包括一些错误结果及解决办法等。 五、实验体会 具体要求 1、 本实验属综合性实验,要使用学校统一的报告纸,附加纸张要 挟在报告纸内并左侧装订; 2、 报告纸的封面要填写完整,项目要与实验日历中的项目完全一 致,否则将返回重写; 3、 报告第四项“实验内容及完成情况”中,只允许对操作结果和 程序运行结果进行打印,其余内容必须用钢笔或水性笔书写, 报告要整洁; 4、 严禁出现雷同报告,如果出现雷同,雷同报告的所有学生本次实 验将作不及格或最低分处理。如果出现不及格实验项目将取消考 试资格。

实验目的及要求 实验三、存储过程及游标 实验目的: 综合运用程序设计和数据结构,使用游标完成具有较完整功能的存储过程。 实验要求: 根据所给的excel表格,完成实验内容。 说明:“招生表”中部分属性保存的是代码值,请按所给代码表完成如下要求。 1.使用SQL语句创建数据库,并在数据库中完成表的创建。(报告中要分析各个表的主键和外键是什么) 创建数据库studentManage

2.写一个存储过程,功能是查询所有招生信息。使用游标完成逐行输出,每行要有行号。(在查询结果中,要求各类代码要替换成具体的文字信息,例如:政治面貌不要显示“01”,而要显示“中共党员”。)

SqlServer触发器实现自动编号

触发器做个实现数据插入表时自动编号的功能, 详细出处参考:https://www.wendangku.net/doc/533248729.html,/article/31031.htm 总结常用基本点如下: 1、触发器有两种类型:数据定义语言触发器(DDL触发器)和数据操纵语言触发器(DML 触发器)。 DDL触发器:在用户对数据库执行数据定义(CREATE、ALTER、DROP或相似的语句)对数据库结构进行修改时激活而做出响应。 DML触发器:在用户对数据库执行数据操作时发生,触发器中的代码会被自动调用。 2、DML触发器分类:Insert触发器、Delete触发器、Update触发器、上面任意类型混合。 3、触发器创建语法: 复制代码代码如下: CREATE TRIGGER ON

{{{FOR|AFTER} <[INSERT] [,] [UPDATE],[DELETE]>}|INSTEAN OF} AS 4、触发器必须附加到表或视图上,触发器不能单独存在。AFTER或FOR触发器不支持视图,INSTEAD OF支持表或视图。 5、INSERT触发器中,SQL Server 会创建一个插入行的副本,并把该副本插入到一个特殊表Insert表中,该表只在触发器作用域内存在。 6、DELETE触发器中,SQL Server 会创建一个删除行的副本,并把该副本插入到一个特殊表Delete表中,该表只在触发器作用域内存在。 7、UPDATE触发器中,SQL Server认为更新的记录是删除了现有的记录,插入更新后的新纪录,所以UPDA TE触发器中包含Insert和Delete两个特殊表,也是只存在触发器作用域内,这两个表的行数完全一样。 8、触发器尽可能简短,因为触发器和触发器内的语句被一同处理,即直到语句执行完成才算是触发器完成。如果代码很长那触发器运行时间就会很长。 下面是个实现自动编号功能的例子: --有两张表,客户表和项目表,要求:新建项目时自动生成项目编号,每个不同的客户的项目的编号从1开始 --项目编号格式为PJ+"-"+"客户编号"+"-"+"日期"+"-"+"流水号" --如项目编号:PJ-ABCD-120805-0001 create table testAccount --创建测试客户表 ( tAccName nvarchar(100), --客户姓名 tAccId nvarchar(32) --客户编号 ) create table testProject --创建测试项目表 ( tProName nvarchar(100), --项目名称 tProId nvarchar(32), --项目编号 tIdAcc nvarchar(100), --客户编号

触发器的基操作

数据库原理与应用 实验报告 实验项目名称:触发器的基本操作

1.实验方案设计 对数据库jxgl进行触发器的创建、使用、查看、删除等操作。 2.实验内容与关键SQL语句、实验结果等 (1)、创建触发器 对表Student创建update触发器TR_Student_Age_update: 创建一个触发器,当向Student表中更新一条记录时,自动显示Student表中的记录: (2)、触发器的引发 对课程表Course创建插入触发器TR_Course_insert: 对表Course插入一条记录: Insert into Course Values(‘8’,‘运筹学’,‘804’,‘2’,‘0.5’)

在Student表上创建TR_Student_delete触发器: 执行删除命令:delete from Student where Sno=’98001’ (3)、查看、修改和删除触发器 ○1、修改触发器 修改触发器TR_Student_Age_update: ○2使用系统存储过程查看触发器 查看已建立的Change_Student_Sel触发器所涉及的表

查看已建立的Change_Student_Sel的命令文本 查看已建立的Change_Student_Sel触发器 ○3、删除触发器 删除前面创建的触发器TR_Student_Age_update

3.疑难与未解决的问题 利用Management Studio创建和修改触发器是出现错误,无法完成触发器的创建。 4.实验体会(含已碰到的问题和解决方法) 触发器脚本中的语句修改正确后,可以完成对触发器的创建。 教师评语及成绩

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), --流水号

数据库原理 触发器

实验六触发器 1、指挥部和策划部总人数不超过总员工人数的30% create trigger TR_12 on 员工 for insert as declare @num1 int,@num2 int,@id char(13) set @num1=(select count(*) 指挥部和策划部总人数 from 员工 where 部门编号in(select 部门编号from 部门where 部门名称in ('指挥部','策划部'))) print @num1 select @num2=count(*) from 员工 select @id=员工编号from inserted if(@num1>@num2*0.3) begin delete from 员工where 员工编号=@id raiserror('不符合标准',7,2) end insert into 员工(员工编号,员工姓名,性别,部门编号) values(2011122400102,'查宁静','女',201)

2.员工编号为:入职日期+部门编号+两位子编号,编写脚本实现,若部门编号变更为四位,员工编号随即改变 create trigger tr_123 on 员工 after update as declare @id1 char(3),@id2 char(3) select @id1=部门编号from deleted select @id2=部门编号from inserted if update(部门编号) begin update 员工 set 员工编号=substring(员工编号,1,8)+@id2+substring(员工编号,12,2) where 员工编号like @id1 +'%' end insert into 员工(员工姓名,性别,部门编号) values('査宁静','女',2011)

相关文档 最新文档