sqlserver 建立学生表上触发器代码

合集下载

SQLServer-触发器使用实例

SQLServer-触发器使用实例

SQLServer 触发器使用实例触发器是一个特殊的存储过程。

常见的有三种:分别使用于Insert , Update , Delete 事件。

一、Trigger语法:create trigger tr_nameon 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 ,inserteddeleted 和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, --借出时间ReturnDAte Datetime, --归还时间...)用到的功能有:1.如果我更改了学生的学号,我希望他的借书记录仍然和这个学生相关(也就是同时更改借书记录表的学号);2.如果该学生已经毕业,我希望删除他的学号的同时,也删除它的借书记录。

SQL Sever存储过程及触发器

SQL Sever存储过程及触发器

1、创建一个存储过程SC_PROC,要求指定学生选课的平均成绩(以学号为参数)。

Create proc sc_proc@sunm varchar(10),@sname varchar(8) output,@avg_grade numeric(3,1) outputAsBeginSelect @avg_grade=avg(grade),@sname=snameFrom sc join s on sc.sno=s.snoWhere s.sno=@snumGroup by snameEnd调用Declare @avg numeric(3,1),@sname1 varchar(8)Exec sc_proc ‘200215121’,@sname=@sname1 output,@avg_grade=@avg outputSelect ‘200215121’,@sname1,@avg2,设有如下定义:declar student cursor for select sno,sname from s;写一段程序,将student中的数据逐一显示出来。

Create procedure s_cursor_procAsBegin --声明变量Declare @xh varchar(10),@xm varchar(10)Declare student cursorFor select sno,sname from sOpen studentFetch next from student into @xh,@xmPrint ‘学号姓名’Print ‘----------------’While @@fetch_status = 0BeginPrint @xh + ‘’ +@xmFetch next from student INTO @xh,@xmEndClose studentDeallocate student --释放游标EndExecute s_cursor_proc3,以s(sno,sname),sc(sno,cno,grade)查询相关数据。

sqlserver中数据增删改 触发器写法

sqlserver中数据增删改 触发器写法

SQL Server是一种关系型数据库管理系统,用于在计算机和服务器上存储和检索数据。

在SQL Server中,数据的增删改操作是非常常见的,而触发器则是一种在数据库中定义的特殊的存储过程,它可以在数据被修改时自动执行。

本文将介绍SQL Server中数据增删改触发器的写法并提供实例演示。

一、触发器的基本概念1.1 触发器定义触发器是一种与表相关的数据库对象,它会在表上插入、更新或删除数据时自动执行。

1.2 触发器分类在SQL Server中,触发器分为INSERT触发器、UPDATE触发器和DELETE触发器,分别表示在数据插入、更新和删除操作时触发执行。

二、触发器的创建与使用2.1 创建触发器在SQL Server中,可以使用CREATE TRIGGER语句创建一个触发器,语法如下:```sqlCREATE TRIGGER trigger_nameON table_nameAFTER INSERT, UPDATE, DELETEASBEGIN-- 触发器执行的逻辑END```2.2 触发器的执行时机在创建触发器时,需要指定触发器执行的时机,包括AFTER和INSTEAD OF两种选项。

AFTER表示在数据操作之后执行触发器逻辑,而INSTEAD OF表示在数据操作之前执行触发器逻辑。

2.3 触发器的使用一旦创建了触发器,它会在指定的操作发生时自动执行,无需手动调用触发器。

三、触发器的编写实例下面我们以一个实际的案例,演示如何在SQL Server中编写数据增删改触发器。

3.1 创建测试表我们创建一个测试表TestTable,用于存储测试数据,表结构如下:```sqlCREATE TABLE TestTable(ID INT PRIMARY KEY,Name NVARCHAR(50))```3.2 创建INSERT触发器接下来,我们创建一个INSERT触发器,当往TestTable表中插入数据时,自动将数据插入到另一个备份表BackupTable中。

sql server触发器的使用及语法

sql server触发器的使用及语法

SQL Server触发器是一种特殊的数据库对象,它可以在表上定义,用于在特定的数据操作(如插入、更新、删除)发生时自动执行一段代码。

触发器可以用于实现数据约束、数据审计、数据变更记录等功能。

以下是SQL Server触发器的使用及语法:.创建触发器:CREATE TRIGGER trigger_name{AFTER | INSTEAD OF} {INSERT | UPDATE | DELETE} ON table_name[WITH ENCRYPTION][FOR | AFTER] {INSERT | UPDATE | DELETE}ASBEGIN-- 触发器执行的代码END.删除触发器:DROP TRIGGER [schema_name.]trigger_name.触发器的类型:•AFTER触发器:在数据操作之后触发执行。

•INSTEAD OF触发器:在数据操作之前触发执行,可以替代原始操作。

.触发器的事件:•INSERT:在向表中插入数据时触发。

•UPDATE:在更新表中的数据时触发。

•DELETE:在从表中删除数据时触发。

.触发器的执行时间:•FOR:在数据操作之前或之后触发执行。

•AFTER:在数据操作之后触发执行。

触发器的代码:触发器的代码可以包含SQL语句、存储过程、函数等。

可以使用INSERTED和DELETED临时表来访问触发器操作的数据。

INSERTED表包含已插入或已更新的数据,DELETED表包含已删除或已更新的数据。

触发器的加密:使用WITH ENCRYPTION选项可以对触发器的定义进行加密,防止他人查看触发器的代码。

需要注意的是,触发器的使用应该谨慎,过多或复杂的触发器可能会影响数据库的性能。

在设计和使用触发器时,要考虑到对数据库性能的影响,并经过充分测试和优化。

SQLServer触发器

SQLServer触发器

SQLServer触发器⼀、定义触发器: 在对数据库数据进⾏操作(增加(insert)、修改(update)、删除(delete))后,可以⾃动执⾏的操作触发器分为两类:instead of 触发器,after(for)触发器。

instead of 触发器:在数据更新到数据库之前执⾏的操作 after(for)触发器:在数据更新到数据后再执⾏的操作数据临时载体:inserted和deleted inserted:存储操作中新增的或者更新的数据 deleted:存储操作中删除的数据⼆、操作1. 新建触发器1--Insert操作INSTEAD OF 触发器2CREATE TRIGGER TRI_ORDER_BEFOREINSERT3ON MyOrder4 INSTEAD OF INSERT5AS6SELECT'BEFOREINSERT'7GO89--Insert操作AFTER 触发器10CREATE TRIGGER TRI_ORDER_AFTERINSERT11ON MyOrder12 AFTER INSERT13AS14SELECT'AFTERINSERT'15GO1617--UPDATE操作INSTEAD OF 触发器18CREATE TRIGGER TRI_ORDER_BEFOREUPDATE19ON MYORDER20 INSTEAD OF UPDATE21AS22SELECT'BEFOREUPDATE'23GO2425--UPDATE操作INSTEAD OF 触发器26CREATE TRIGGER TRI_ORDER_AFTERUPDATE27ON MYORDER28 AFTER UPDATE29AS30SELECT'AFTERUPDATE'31GO2. 新增1INSERT INTO MyOrder (OrderCode,OrderStatus,DocSex) VALUES('001',1,1)结果如图: 只触发了Insert操作INSTEAD OF 触发器,⽽After触发器没有触发,并且数据新增失败3.在Insert操作INSTEAD OF 触发器添加新增操作1--Insert操作INSTEAD OF 触发器2ALTER TRIGGER TRI_ORDER_BEFOREINSERT3ON MyOrder4 INSTEAD OF INSERT5AS67SELECT'BEFOREINSERT'8DECLare@DocSex INT 910SELECT@DocSex= DocSex From inserted11IF(@DocSex=1)12BEGIN13INSERT INTO MyOrder14SELECT* FROM inserted15END16GO4.再次执⾏新增语句1INSERT INTO MyOrder (OrderCode,OrderStatus,DocSex) VALUES('001',1,1)结果如图: Insert操作INSTEAD OF 触发器和After触发器都触发了,并且数据新增成功5.代码⾥⾯我们添加了DocSex=1的条件过滤,下⾯我们添加⼀条DocSex=2的记录看看1INSERT INTO MyOrder (OrderCode,OrderStatus,DocSex) VALUES('002',1,2)结果如图: 只触发了Insert操作INSTEAD OF 触发器,⽽After触发器没有触发,并且数据新增失败上述结果说明: 如果同时存在NSTEAD OF 触发器和After触发器,数据库会先执⾏NSTEAD OF 触发器,在NSTEAD OF 触发器中经过筛选再执⾏NSTEAD OF 触发器中的Insert操作才会触发After触发器。

SQLServer触发器的写法

SQLServer触发器的写法

SQLServer触发器的写法触发器的概念很容易理解,可以简单地看成事件-条件-动作规则。

即特定的事件发生并满足条件,就执行动作,否则啥也不干。

但是触发器的写法不同的书却有很大区别,并且有些在SQLserver 2008 R2上并不能执行,这里记录一种 insert / update / delete 触发器。

创建一个商品表GOODS,eg:1.CREATE TABLE GOODS(2.Gno char(4) PRIMARY KEY,3.Gname char(10),4.Price int);1. INSERT触发器为表GOODS建立一个INSERT触发器,当插入商品的价格高于9999时,拒绝插入(回滚,撤销插入事务)向目标表中插入数据时,会触发该表的Insert 触发器,系统自动在内存中创建inserted表,存放要(已,取决于after/before)插入的数据。

1.CREATE TRIGGER TRI_INSERT ON GOODS2.AFTER INSERT3.AS4.BEGIN5.Declare @pri int;6.Select @pri=Price From inserted7.IF(@pri > 9999)8.Begin9.print('太贵了,价格应小于9999')10.rollback11.END12.END测试触发器:1.INSERT INTO GOODS2.VALUES('1','大白菜','3')成功执行;1.INSERT INTO GOODS2.VALUES('2','菲力牛排','19999')拒绝插入(插入事务被撤销)2. Update触发器在目标表中更新数据时,会触发该表的Update 触发器,系统自动在内存中创建deleted表和inserted表,deleted表存放的是更新前的数据,inserted表存放的是更新后的数据。

sqlserver编程之触发器

sqlserver编程之触发器

和表
修改操作 增加()记录 删除()记录 修改()记录
表 存放新增的记 录
存放更新后的 记录

存放被删除的 记录 存放更新前的 记录
表和表存放的信息
二、创建触发器
创建触发器的语法:
[] [, , ]
语句
表示加密触发器定义的文本 , , 指定触发器的类型
创建触发器
§ 和 是完全相等的,创建相同类型的触发器,在、 或 语句执行后触发
息表()中插入一条交易信息时,我们应
自动更新对应帐户的余额。
帐户信息表
张三开户1000元, 李四开户1元
交易信息表
张三取钱200 问题:
没有自动修改张三的余额
§分析: §在交易信息表上创建触发器 §从临时表中获取插入的数据行 §根据交易类型()字段的值是存入/支取, § 增加/减少对应帐户的余额。
§不像普通的存储过程,触发器不能被直接调用,也 不传递或接受参数
§当使用约束、规则、默认值就可以实现预定的数据 完整性时,应该优先使用前3种措施。
4.触发器的类型
§ 触发器 § 触发器 § 触发器
5和
触发器触发时: 系统自动在内存中创建表或表 只读,不允许修改;触发器执行完成后,自动删除 表 临时保存了插入或更新后的记录行 可以从表中检查插入的数据是否满足业务需求 如果不满足,则向用户报告错误消息,并回滚操作 表 临时保存了删除或更新前的记录行 可以从表中检查被删除的数据是否满足业务需求 如果不满足,则向用户报告错误消息,并回滚操作
触发器示例关键பைடு நூலகம்码
从表中获取交易类型、 交易金额等
(4) (10) ,
('支取')
=+ …..

SQLSERVER触发器(附有实例)

SQLSERVER触发器(附有实例)

SQLSERVER触发器(附有实例)触发器:即当发⽣某⼀事件时,如果满⾜给定条件,则执⾏相应的动作。

它的基本架构:触发器创建语法:(1)CREATETRIGGER trigger_nameON table|viewFOR|AFTER|INSTEADOF [DELETE][,INSERT][,UPDATE]ASSql_statement[…n](2)CREATETRIGGER trigger_nameON table|viewFOR|AFTER|INSTEADOF [DELETE][,INSERT][,UPDATE]ASIFUPDATE(column)[{AND|OR}UPDATE(COLUMN)][…]IF(COLUMNS_UPDATED())Sql_statement[…n]注:(不同数据库⽀持不同的类型触发器,有些还⽀持before类型触发器,像SQL server 就不⽀持before触发器)SQL Server⽀持两种类型的触发器AFTER触发器和INSTEAD OF 触发器,其中、AFTER触发器要求只有执⾏某⼀操作ISERT, UPDATE ,DELETE之后触发器才被触发。

1)INSTEAD OF 触发器表⽰并不执⾏其所定义的操作INSERT,UPDATE ,DELETE,⽽仅是执⾏触发器本⾝,既可在表上定义INSTEAD OF 触发器,也可以在视图上定义INSTEAD OF 触发器。

2)after 触发器(也叫“FOR”触发器)则会在触发 insert、update 或是delect 动作之后执⾏。

触发事件分为三类:UPDATE、DELETE和INSERT。

另外,定义触发器时,系统都都会⾃动⽣成两张表,我们是可以直接⽤的,如下:如下是实例(都是亲⼿实践过的):1.在表Student中建⽴删除触发器,实现表Student和表SC的级联删除,也就是只要删除表Student中的元组学号为s1,则表SC中SNO为s1的元组也要删除;建⽴完触发器后⽤企业管理器删除Student中学号为30的元组,看看表SC中SNO为30的选课记录是否也⼀起删除;create trigger t_std2 on studentinstead of deleteasbegindeclare @id char(5)select @id=sno from deleteddelete from sc where SNo =@iddelete from student where SNo=@idendgodelete from Student where SNo='00002'/*2. 在表Course中增加⼀个职业规划选修课,为(005,职业规划,4,0014),在表SC中建⽴⼀个触发器,实现规定年龄24岁以上(包括24岁)的学⽣才能选修职业规划这门课程,如果年龄⼩于24岁,则输出’年龄⼩于24,不能选修该门课程’,插⼊失败,⽤SQL语句在SC表中分别插⼊(‘00001’,’005’,null)和(‘00005’,’005’,null)看看结果;**/create trigger t_sc on scfor insertasbegindeclare @id char(5)select @id=sno from insertedif((select cno from inserted)='005' and (select sage from student where SNo= @id )<24)beginprint '年龄⼩于24,不能选修该门课程 'rollback transactionendelseprint 'nice!'endinsert into course values('005','职业规划','4','0014')insert into sc values('00001','005',null)insert into sc values('00005','005',null)select * from scgo3.在表SC中建⽴更改触发器,实现表SC中的修改后的成绩不能低于修改前的成绩,如果修改后的成绩低于修改前的成绩,则输出’修改后的成绩⽐修改前低,不能修改’,修改失败,⽤SQL语句把学号为00001,课程号为001的成绩分别改为90和70,看看结果;createtrigger t2_sc on scafter updateasif(update(score))begindeclare @score1 numeric(3,1),@score2numeric(3,1)select @score1=score from insertedselect @score2=score from deletedif(@score1>@score2 )print 'nice! 'elseupdate scset sc.Score=@score2 from sc,deletedwhere sc.SNo=deleted.SNo o=oprint '失败'endupdate scsetScore=70 where SNo='00001' and CNo='001'4. 在表Teacher中创建触发器,实现如果更新了表Teacher中的年龄和⼯资,则输出’更新了年龄和⼯资’,如果更新了年龄没有更新⼯资,则输出’更新了年龄’,如果更新了⼯资⽽没有更新年龄,则输出’更新了⼯资’,创建完后使⽤SQL语句把tno为001的年龄加1,把tno为002的⼯资加1,把tno为003的年龄和⼯资都加1,看看结果;create trigger t_teacher on teacherafter updateasbegindeclare @age int,@sal floatselect @age=age from deletedselect @sal=sal from deletedif(@age <> (select age from inserted )and @sal <>(select sal from inserted))print '更新了年龄和⼯资 'else if(@age <> (select age from inserted )and @sal =(select sal from inserted))print '更新了⼯资 'else if(@age = (select age from inserted )and @sal <>(select sal from inserted))print '更新了年龄 'endupdate Teacherset age=age+1 where Tno='0001'**//**5. 在不删除触发器的前提下,使3创建的触发器⽆效;alter table teacher disable trigger t_teacher**//**6. 创建⼀个名为tri_Delete_C的触发器,要求⾸先判断数据库中是否已经存在名为tri_Delete_C的触发器,如果存在,⾸先删除,再创建,触发器要求删除⼀门课程时候,⾸先判断该课程有否有⼈选,如果有⼈选,则不能删除,并通过测试数据验证该触发器的执⾏情况。

SQLServer的触发器介绍和创建使用教程

SQLServer的触发器介绍和创建使用教程

SQLServer的触发器介绍和创建使用教程SQL Server 触发器触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程。

触发器主要是通过事件进行触发被自动调用执行的。

而存储过程可以通过存储过程的名称被调用。

什么是触发器触发器对表进行插入、更新、删除的时候会自动执行的特殊存储过程。

触发器一般用在check约束更加复杂的约束上面。

触发器和普通的存储过程的区别是:触发器是当对某一个表进行操作。

诸如:update、insert、delete这些操作的时候,系统会自动调用执行该表上对应的触发器。

SQL Server 2005中触发器可以分为两类:DML触发器和DDL触发器,其中DDL触发器它们会影响多种数据定义语言语句而激发,这些语句有create、alter、drop语句。

DML触发器分为:1、 after触发器(之后触发)a、 insert触发器b、 update触发器c、 delete触发器2、 instead of 触发器(之前触发)其中after触发器要求只有执行某一操作insert、update、delete之后触发器才被触发,且只能定义在表上。

而instead of触发器表示并不执行其定义的操作(insert、update、delete)而仅是执行触发器本身。

既可以在表上定义instead of触发器,也可以在视图上定义。

触发器有两个特殊的表:插入表(instered表)和删除表(deleted表)。

这两张是逻辑表也是虚表。

有系统在内存中创建者两张表,不会存储在数据库中。

而且两张表的都是只读的,只能读取数据而不能修改数据。

这两张表的结果总是与被改触发器应用的表的结构相同。

当触发器完成工作后,这两张表就会被删除。

Inserted表的数据是插入或是修改后的数据,而deleted表的数据是更新前的或是删除的数据。

对表的操作Inserted逻辑表Deleted逻辑表增加记录(insert)存放增加的记录无删除记录(delete)无存放被删除的记录修改记录(update)存放更新后的记录存放更新前的记录Update数据的时候就是先删除表记录,然后增加一条记录。

SQLServer2000编程之触发器

SQLServer2000编程之触发器

李四
1000 0002 20001
检查deleted和inserted表中的数据,确定是 否需要回滚或执行其他操作
UPDATE触发器示例
问题:
跟踪用户的交易,交易金额超过20000元,则取消交易,并 给出错误提示。
分析:
在bank表上创建UPDATE触发器 修改前的数据可以从deleted表中获取 修改后的数据可以从inserted表中获取
inserted 和deleted 表
修改操作
inserted表 deleted表
增加 (INSERT)记 录
存放新增的记 录
------
删除 (DELETE)记 录
-----
存放被删除的 记录
修 (U改PDATinEs)e记rted表存 记和放录d更ele新te后d表的存放存记的放录信更息 新前的
从deleted表中 获取被删除的
交易记录
IF NOT EXISTS(SELECT * FROM sysobjects
WHERE name='backupTable')
SELECT * INTO backupTable FROM deleted
ELSE
INSERT INTO backupTable
SELECT * FROM deleted
帐户信息表bank
张三开户1000元, 李四开户1元
张三取钱200
问题:
交易信息表transInfo
没有自动修改张三的余额
最优的解决方案就是采用触发器:
它是一种特殊的存储过程
也具备事务的功能
它能在多表之间执行特殊的业务规则
1.什么是触发器
赵二退休 删除
员工表

SQL触发器实例

SQL触发器实例

SQL触发器实例16.2.3 INSERT触发器实例1 创建INSERT触发器为STUDENT表创建触发器S_insert,当向STUDENT表中插入数据时,要求学号必须以“97”开头,且课程号CNO必须在COURSE表中,否则取消插入操作。

实例代码如下。

CREATE TRIGGER S_insertON STUDENTFOR INSERT ASDECLARE @S_no V ARCHAR(4), @S_cno INTSELECT @S_no= SNO, @S_cno=CNOFROM INSERTEDIF (LEFT(@S_no,2)!='97')BEGINROLLBACK TRANSACTIONRAISERROR('输入的学号:%s不是97级的学生,请确认后重新录入!',16,1, @S_no)ENDIF(@S_cno NOT IN (SELECT CNO FROM COURSE))BEGINROLLBACK TRANSACTIONRAISERROR('输入的课程号:%d在COURSE表中不存在,请确认后重新录入!',16,1, @S_cno) END当通过如下语句向STUDENT表中插入数据时:INSERT INTO STUDENT V ALUES('9602','王永','机械工程','男',2,76,'必修')由于插入数据的学号为“9602”,并不是以“97”开头,所以执行S_insert触发器时,将执行“ROLLBACK TRANSACTION”语句,取消完成的工作,并执行RAISERROR语句给出错误信息。

运行结果如下。

输入的学号:9602不是97级的学生,请确认后重新录入!当通过如下语句向STUDENT表中插入数据时:INSERT INTO STUDENT V ALUES('9702','王永','机械工程','男',12,76,'必修')由于课程号12在COURSE表中不存在,所以执行S_insert触发器时,将执行“ROLLBACK TRANSACTION”语句,取消工作,并执行RAISERROR语句给出错误信息。

SQL Server触发器语法

SQL Server触发器语法

SQL触发器语法参考CreateTRIGGER trigger_nameON{table|view}[WITH ENCRYPTION]{{{FOR|AFTER|INSTEAD OF}{[Insert][,][Updat e]}[WITH APPEND][NOT FOR REPLICATION]AS[{IF Update(column)[{AND|or}Update(column)][...n]|IF(COLUMNS_UpdateD(){bitwise_operator}updated _bitmask){comparison_operator}column_bitmask[...n] }]sql_statement[...n]}}参数trigger_name是触发器的名称。

触发器名称必须符合标识符规则,并且在数据库中必须唯一。

可以选择是否指定触发器所有者名称。

Table|view是在其上执行触发器的表或视图,有时称为触发器表或触发器视图。

可以选择是否指定表或视图的所有者名称。

WITH ENCRYPTION加密syscomments表中包含Create TRIGGER语句文本的条目。

使用WITH ENCRYPTION可防止将触发器作为SQL Server复制的一部分发布。

AFTER指定触发器只有在触发SQL语句中指定的所有操作都已成功执行后才激发。

所有的引用级联操作和约束检查也必须成功完成后,才能执如果仅指定FOR关键字,则AFTER是默认设置。

不能在视图上定义AFTER触发器。

INSTEAD OF指定执行触发器而不是执行触发SQL语句,从而替代触发语句的操作。

在表或视图上,每个Insert、Update或Delete语句最多可以定义一个INSTEAD OF触发器。

然而,可以在每个具有INSTEAD OF触发器的视图上定义视图。

INSTEAD OF触发器不能在WITH CHECK OPTION的可更新视图上定义。

sql server触发器的使用及语法

sql server触发器的使用及语法

sql server触发器的使用及语法SQL Server触发器是一种数据库对象,它可以在指定的表上自动执行程序,以响应特定的数据库事件或操作。

通过使用触发器,可以在不直接修改应用程序代码的情况下,实现对数据库的自动化操作和控制。

本文将介绍SQL Server触发器的使用及其语法。

一、触发器的基本概念触发器是与表相关联的特殊类型的存储过程。

当插入、更新或删除表中的数据时,触发器可以自动执行一系列的操作。

触发器可以用于实现数据的验证、约束和业务逻辑的处理。

它们可以在数据被更改之前或之后触发,以及在每一行被更改之前或之后触发。

二、触发器的创建和使用在SQL Server中,可以使用CREATE TRIGGER语句来创建触发器。

语法如下:```CREATE TRIGGER trigger_nameON table_name{FOR | AFTER | INSTEAD OF} {INSERT | UPDATE | DELETE}ASBEGIN-- 触发器的逻辑代码END```其中,trigger_name是触发器的名称,table_name是触发器所属的表名,{FOR | AFTER | INSTEAD OF} {INSERT | UPDATE | DELETE}是触发器的触发事件,BEGIN和END之间是触发器的逻辑代码。

三、触发器的类型SQL Server中的触发器可以分为三种类型:INSERT触发器、UPDATE触发器和DELETE触发器。

1. INSERT触发器INSERT触发器在向表中插入新记录之前或之后触发。

可以在INSERT触发器中执行一些额外的逻辑操作,例如记录日志、更新其他表等。

2. UPDATE触发器UPDATE触发器在更新表中的记录之前或之后触发。

可以在UPDATE触发器中进行一些数据验证、约束或业务逻辑处理。

3. DELETE触发器DELETE触发器在从表中删除记录之前或之后触发。

sqlserver触发器

sqlserver触发器

CREATE TRIGGER t_dalii ON [dbo].[员工明细表]FOR INSERTASdeclare @v_char1 varchar(20),@v_char2 varchar(20),@v_char3 int,@v_char4 varchar(20),@v_char5 datetimebeginset @v_char1=(select 所属部门 from inserted)if @v_char1<>nullbeginif exists(select 部门号 from 部门状态表 where 部门=@v_char1)set @v_char2=(select 部门号 from 部门状态表 where 部门=@v_char1)elseset @v_char2=((select max(部门号) from 部门状态表 )+1)endset @v_char3=(select 编号 from inserted)set @v_char4=(select 姓名 from inserted)set @v_char5=(select 入厂时间 from inserted)insert into 部门人员表 (部门号,部门,编号,姓名,员工属性,进部门时间,是否在职,是否下岗 )values(@v_char2,@v_char1,@v_char3,@v_char4,''职员'',@v_char5,''是'',''否'')end---------------------------------------------------------------:create trigger tr_nameon 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 :触发器所作用的表。

sqlserver的触发器练习实例

sqlserver的触发器练习实例

sqlserver的触发器练习实例触发器的概念:它是由事件驱动的,就像java中的监听,当某个事件发⽣了,就会做⼀些⼯作。

下⾯直接上⼲货,创建insert触发器、delete触发器、DDL触发器和如何查看触发器定义1.创建三个表学⽣表、班级表、课程表create database student_scoreGO--在数据库中创建三个表学⽣表、班级表、课程表的结构use student_scoreGOcreate table student( stu_id char(8) primary key,stu_name char(10),stu_sex char(2),stu_birthday smalldatetime,class_id char(6))gocreate table class( class_id char(6) primary key,class_name varchar(30),class_num int,)create table course( course_id char(3) primary key,course_name varchar(30),)gocreate table score( stu_id char(8),course_id char(3),score int check(score>=0 and score<=100)primary key(stu_id,course_id))go2.插⼊⽤例数据--往表中插⼊数据(student,course,score)insert into student values('0601001','李⽟','⼥','1987-05-06', '0601')insert into student values('0601002','鲁敏','⼥','1988-06-28', '0601')insert into student values('0601003','李⼩路','⼥','1987-01-08', '0601')insert into student values('0601004','鲁斌','男','1988-04-21', '0601')insert into student values('0601005','王宁静','⼥','1986-05-29', '0601')insert into student values('0601006','张明明','男','1987-02-24', '0601')insert into student values('0601007','刘晓玲','⼥','1988-12-21', '0601')insert into student values('0601008','周晓','男','1986-04-27', '0601')insert into student values('0601009','易国梁','男','1985-11-26', '0601')insert into student values('0601010','季风','男','1986-09-21', '0601')insert into class values('0501','计算机办公应⽤', 40)insert into class values('0502','⽹络构建', 43)insert into class values('0503','图形图像', 48)insert into class values('0601','可视化', 41)insert into class values('0602','数据库', 38)insert into class values('0603','⽹络管理', 45)insert into class values('0604','多媒体', 40)insert into class values('0701','计算机办公应⽤', 39)insert into class values('0702','WEB应⽤', 38)insert into class values('0703','⽹络构建', 40)insert into course values('001','计算机应⽤基础')insert into course values('002','关系数据基础')insert into course values('003','程序设计基础')insert into course values('004','数据结构')insert into course values('005','⽹页设计')insert into course values('006','⽹站设计')insert into course values('007','SQL Server 2000关系数据库')insert into course values('008','SQL Server 2000程序设计')insert into course values('009','计算机⽹络')insert into course values('010','Windows Server 配置')insert into score values('0601001','001',78)insert into score values('0601002','001',88)insert into score values('0601003','001',65)insert into score values('0601004','001',76)insert into score values('0601005','001',56)insert into score values('0601006','001',87)insert into score values('0601007','001',67)insert into score values('0601008','001',95)insert into score values('0601009','001',98)insert into score values('0601010','001',45)insert into score values('0601001','002',48)insert into score values('0601002','002',68)insert into score values('0601003','002',95)insert into score values('0601004','002',86)insert into score values('0601005','002',76)insert into score values('0601006','002',57)insert into score values('0601007','002',77)insert into score values('0601008','002',85)insert into score values('0601009','002',98)insert into score values('0601010','002',75)insert into score values('0601001','003',88)insert into score values('0601002','003',78)insert into score values('0601003','003',65)insert into score values('0601004','003',56)insert into score values('0601005','003',96)insert into score values('0601006','003',87)insert into score values('0601007','003',77)insert into score values('0601008','003',65)insert into score values('0601009','003',98)insert into score values('0601010','003',75)insert into score values('0601001','004',74)insert into score values('0601002','004',68)insert into score values('0601003','004',95)insert into score values('0601004','004',86)insert into score values('0601005','004',76)insert into score values('0601006','004',67)insert into score values('0601007','004',77)insert into score values('0601008','004',85)insert into score values('0601009','004',98)insert into score values('0601010','004',75)insert into score values('0601001','005',74)insert into score values('0601002','005',68)insert into score values('0601005','005',76)insert into score values('0601008','005',85)insert into score values('0601009','005',98)insert into score values('0601010','005',75)insert into score values('0601002','006',88)insert into score values('0601003','006',95)insert into score values('0601006','006',77)insert into score values('0601008','006',85)insert into score values('0601010','006',55)insert into score values('0601001','007',84)insert into score values('0601002','007',68)insert into score values('0601003','007',95)insert into score values('0601004','008',86)insert into score values('0601005','008',76)insert into score values('0601006','008',67)insert into score values('0601007','009',67)insert into score values('0601008','009',85)insert into score values('0601009','010',98)insert into score values('0601010','010',75)3.练习实例--1)在student上创建INSERT触发器stu_insert,要求在student表中插⼊记录时(要求每次只能插⼊⼀条记录),这个触发器都将更新class表中的class_nun列。

SQLServer存储过程与触发器

SQLServer存储过程与触发器
– DML触发器又分为两类:After触发器和Instead Of触发器
DDL触发器:
– DDL触发器是在响应数据定义语言(Data Definition Language)事件时执行的存储过程。DDL触发器一般用于 执行数据库中管理任务。如审核和规范数据库操作、防止 数据库表结构被修改等。
– SQL SERVER 2005新增添功能
– 对于这两个表,用户只有读取的权限,没有修改的权限。 – 这两个表的结构与触发器所在数据表的结构是完全一致的,
当触发器的工作完成之后,这两个表也将会从内存中删除。
插入表里存放的是更新前的记录
– 对于插入记录操作来说,插入表里存放的是要插入的数据 – 对于更新记录操作来说,插入表里存放的是要更新的记录。
检查所做的SQL是否允许
– 触发器可以检查SQL所做的操作是否被允许。
例如:在产品库存表里,如果要删除一条产品记录,在删除记录时, 触发器可以检查该产品库存数量是否为零,如果不为零则取消 该删除操作。
修改其它数据表里的数据
– 当一个SQL语句对数据表进行操作的时候,触发器可以根据 该SQL语句的操作情况来对另一个数据表进行操作。
– 系统存储过程在Master数据库中,在其他数据库中 可以直接调用,调用时不必在存储过程名前加上数 据库名。
2021/5/4
4
自定义存储过程
自定义存储过程是由用户创建并能完成 某一特定功能的存储过程。
2021/5/4
5
存储过程的优点
1.提高应用程序的通用性和可移植性 2.可以更有效地管理用户操作数据库的权限 3.可以提高T-SQL的速度 4.减轻服务器的负担 5.块化程序设计。 6.减少操作错误。 7.能自动处理复杂的或敏感的事务。 8.可以实现管理任务自动化。

SQLServer创建触发器(trigger)

SQLServer创建触发器(trigger)

SQLServer创建触发器(trigger)from:https:///Brambling/archive/2017/04/21/6741666.html触发器简介:触发器是⼀种特殊的存储过程,它的执⾏不是由程序调⽤,也不是⼿动执⾏,⽽是由事件来触发。

触发器是当对某⼀个表进⾏操作。

例如:update、insert、delete这些操作的时候,系统会⾃动调⽤执⾏该表上对应的触发器。

触发器分类:1、DML(数据操纵语⾔ Data Manipulation Language)触发器:是指触发器在数据库中发⽣ DML 事件时将启⽤。

DML事件是指在表或视图中对数据进⾏的 insert、update、delete 操作的语句。

2、DDL(数据定义语⾔ Data Definition Language)触发器:是指当服务器或数据库中发⽣ DDL 事件时将启⽤。

DDL事件是指在表或索引中的 create、alter、drop 操作语句。

3、登陆触发器:是指当⽤户登录 SQL SERVER 实例建⽴会话时触发。

如果⾝份验证失败,登录触发器不会触发。

其中 DML 触发器⽐较常⽤,根据 DML 触发器触发的⽅式不同⼜分为以下两种情况:after 触发器(之后触发):其中 after 触发器要求只有执⾏ insert、update、delete 某⼀操作之后触发器才会被触发,且只能定义在表上。

instead of 触发器(之前触发):instead of 触发器并不执⾏其定义的操作(insert、update、delete)⽽仅是执⾏触发器本⾝。

可以在表或视图上定义 instead of 触发器。

DML 触发器有两个特殊的表:插⼊表(instered)和删除表(deleted),这两张表是逻辑表。

这两个表是建⽴在数据库服务器的内存中,⽽且两张表的都是只读的。

这两张表的结构和触发器所在的数据表的结构是⼀样的。

当触发器完成⼯作后,这两张表就会被删除。

sqlserver建立学生表上触发器代码

sqlserver建立学生表上触发器代码

sqlserver建立学生表上触发器代码--⒁在学生成绩表中,显示存在有 85 分以上成绩的课程号,并统计各门课程不及格人数在 10 人以上的课程数量。

SELECT course_id FROM stud_grade WHERE grade>85GOselect count(*)from(SELECT course_id 课程号,count(course_id) 人数FROM stud_gradeWHERE grade<60GROUP BY course_idHAVING count(course_id) >=10)-(7) 首先显示“计算机工程系”、“计算机网络技术专业”、班全体学生的基本信息,然后再统计“计算机工程系”、“计算机网络技术专业”、班的学生人数。

SELECT substring(stud_id,3,6)专业编号,count(*)人数FROM stud_infoWHERE substring(stud_id,3,6)=(select substring(speccode,3,6)+'02'from dbo.specialty_codewhere specname='计算机应用技术')--(9)在学生成绩表中,显示最低分大于60,最高分小于80 的stud_id 列。

select stud_idfrom dbo.stud_gradegroup by stud_idhaving 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 g2where 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.gradeorder by g1.grade。

SQL Server2008创建修改触发器-SQL语句方式

SQL Server2008创建修改触发器-SQL语句方式
SQL Server2008创建修改触发器—SQL语句方式
create update trigger with SQL statement in SQL Server2008
2
知识点内容概要
创建触发器语法 创建修改触发器实例
3 创建触发器语法
CREATE TRIGGER触发器名 ON 表名 FOR|After|Instead of 触发动作(insert|delete|update) AS
else update n set num=num+1, woman=ISNULL(woman,0)+1 where class=@class
End
7 创建修改触发器实例
8 创建修改触发器实例
查看表N当前数据为:
9 创建修改触发器实例
在s表中修改一条记录: update s set sex='男' where sno='s3'
10 创建修改触发器实例
验证:表n中的统计人数,因为表s中将软件1501班的一个由女生修改为男生,相应n 表中的人数统计随之改变。
11 拓展练习
请操作: 在表S中创建修改触发器,若修改S表中学生的学号,则SC表中与该学生相关 的学号自动修改。
5 创建修改触发器实例
【实例1】在表s上创建Update触发器,实现表s修改数据时与表n间数据的一致性。
create trigger s_update on s for update as begin
declare @class char(4),@sex char(2) select @class=class,@sex=sex from deleted
if @sex='男' update n set num=num-1,man=man-1 where class=@class

在MSSQL Server中创建触发器

在MSSQL Server中创建触发器

1. 触发器的概念触发器是一种特殊类型的存储过程。

当表中数据被修改时,SQL Server将自动执行触发器。

使用触发器可以实施较为复杂的数据完整性约束。

在SQL Server中,数据库的表之间可以声明参照完整性约束,即主键(PRIMARYKEY)和外键(FOREIGNKEY)约束。

在同一数据库中的简单参照完整性通常由主键和外键约束来实现。

但是,由于声明参照完整性约束不能参照其他数据库中的对象,而对于数据库之间的参照完整性约束就只有通过触发器来实现。

引用完整性约束与触发器,对数据操作构成了双重的有效性约束。

当对一个同时具有约束和触发器的表进行数据修改操作时,SQL Server将先进行约束检查,然后再执行触发器检查。

如果这些语句的操作符合约束条件,系统将完成数据操作,然后再激活触发器;如果该语句未能通过约束检查,将不执行该数据操作语句,也就不可能激活触发器。

如果某语句通过了约束检查而未能通过触发器检查,触发器也将取消该语句已经执行完毕的操作。

触发器的主要优点是:任何一种对触发器表中数据进行修改的操作(包括操作人员录入数据或其他应用程序的修改)都能自动激活触发器,从而触发对这些操作进行的完整性检查。

(1)触发器能够实施的检查和操作比主键和外键约束、CHECK约束和规则对象等更为复杂。

例如,CHECK约束只能根据一个逻辑表达式或同一个表中其他列值来检查指定列值的有效性,而使用触发器时则可以参照其他表中的列值。

(2)触发器建立在表一级,它与特定的数据修改事件相对应。

而INSERT、UPDATE和DELETE三种操作都可能导致数据的修改,所以SQL Server中的触发器可分为 INSERT触发器、UPDATE触发器和DELETE触发器三种。

而且SQL Server 2000版本中允许对同一数据对象修改事件、同一个数据操作定义多个触发器,这在SQLServer7.0以前的版本中是被禁止的。

触发器只能由数据库所有者创建。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

--⒁在学生成绩表中,显示存在有 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。

相关文档
最新文档