sqlserver 建立学生表上触发器代码
- 格式:doc
- 大小:22.50 KB
- 文档页数:1
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.如果该学生已经毕业,我希望删除他的学号的同时,也删除它的借书记录。
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)查询相关数据。
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触发器的使用及语法:.创建触发器: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触发器⼀、定义触发器: 在对数据库数据进⾏操作(增加(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 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触发器(附有实例)触发器:即当发⽣某⼀事件时,如果满⾜给定条件,则执⾏相应的动作。
它的基本架构:触发器创建语法:(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的触发器介绍和创建使用教程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数据的时候就是先删除表记录,然后增加一条记录。
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触发器语法参考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中,可以使用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触发器在从表中删除记录之前或之后触发。
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的触发器练习实例触发器的概念:它是由事件驱动的,就像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创建触发器(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),这两张表是逻辑表。
这两个表是建⽴在数据库服务器的内存中,⽽且两张表的都是只读的。
这两张表的结构和触发器所在的数据表的结构是⼀样的。
当触发器完成⼯作后,这两张表就会被删除。
--⒁在学生成绩表中,显示存在有 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。