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.如果该学生已经毕业,我希望删除他的学号的同时,也删除它的借书记录。

09-触发器(SQL Server)

09-触发器(SQL Server)

维护数据一致性的触发器示例1 维护数据一致性的触发器示例
设有销售表, 设有销售表,结构如下 create table sales( pro_id char(10) not null, stor_id char(8) not null, s_date smalldatetime not null, qty int, total int default 0)
示例1 示例
定义限制t1表中 列的取值在 定义限制 表中c1列的取值在 到100范围 表中 列的取值在0到 范围 的触发器。 的触发器。 CREATE TRIGGER tri2 ON t1 INSTEAD OF update, insert as if not exists (select * from inserted where c1 not between 0 and 100) insert into t1 select * from inserted
4 前触发型触发器
触发型的触发器, 触发型的触发器,指定执行触发器而不是执行引 发触发器执行的SQL语句,从而替代引发语句的 语句, 发触发器执行的 语句 操作 当为表或视图定义了针对某一操作( 当为表或视图定义了针对某一操作(INSERT、 、 DELETE、UPDATE )的INSTEAD OF 类型触发 、 器且执行了相应的操作时, 器且执行了相应的操作时,尽管触发器被触发但 相应的操作并不被执行, 相应的操作并不被执行,而运行的仅是触发器 SQL 语句本身 在表或视图上,每个INSERT、UPDATE或 在表或视图上,每个 、 或 DELETE语句最多可以定义一个 语句最多可以定义一个INSTEAD OF触 语句最多可以定义一个 触 发器。 发器。 INSTEAD OF触发器不能在有 触发器不能在有WITH CHECK 触发器不能在有 OPTION选项的可更新视图上定义 选项的可更新视图上定义

SqlServer触发器的原理及案例

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_nameON { table | view } [ WITH ENCRYPTION ]{{ FOR | AFTER | INSTEAD OF }{ [ INSERT ] [ , ] [ UPDATE ] [, ][DELETE]}ASsql_statement [...n ]}触发器示例:⏹CREATE TRIGGER reminder ON titles FOR INSERT, UPDATEASRAISERROR (50009, 16, 10)指定触发器何时激发⏹AFTER 触发器在触发操作(INSERT、UPDATE 或DELETE)后和处理完任何约束后激发。

可通过指定AFTER 或FOR 关键字来请求AFTER 触发器。

⏹INSTEAD OF 触发器代替触发动作进行激发,并在处理约束之前激发。

⏹对于每个触发操作(UPDATE、DELETE 和INSERT),每个表或视图只能有一个INSTEAD OF 触发器。

sqlserver触发器例题

sqlserver触发器例题

sqlserver触发器例题SQL Server 触发器是一种数据库对象,它可以在特定表上的数据发生更改时自动执行一系列操作。

触发器可以用于实现业务规则和数据完整性约束,以及跟踪数据变化等功能。

在本文中,我们将介绍两个 SQL Server 触发器的例题及其解决方案。

例题一:在一张名为"Employee"的表上创建一个触发器,以便在插入新员工记录时自动将当前日期作为"hire_date"字段的默认值。

解决方案:首先,我们需要使用下面的 SQL 命令创建一个名为"Employee"的表,并在该表中添加一个"hire_date"字段:```sql CREATE TABLE Employee ( employee_id INT PRIMARY KEY, employee_name VARCHAR(50), hire_date DATE ) ```接下来,我们可以使用下面的 SQL 命令创建一个名为"trg_Employee_Insert"的触发器:```sql CREATE TRIGGER trg_Employee_Insert ON Employee FOR INSERT AS BEGIN UPDATE Employee SET hire_date = GETDATE() WHERE employee_id IN (SELECT employee_id FROM inserted) END ```在这个触发器中,我们使用了"FOR INSERT"来指定触发器在插入操作之后执行。

然后,我们使用了"GETDATE()"函数来获取当前日期,并将其更新到"hire_date"字段中。

现在,当我们向"Employee"表中插入一条新的员工记录时,触发器将自动将当前日期作为"hire_date"字段的默认值:```sql INSERT INTO Employee (employee_id, employee_name) VALUES (1, 'John') ```例题二:在一张名为"Orders"的表上创建一个触发器,以便在删除订单记录时自动将相应的产品库存加回去。

sqlserver 触发器if else语句

sqlserver 触发器if else语句

sqlserver 触发器if else语句SQL Server 触发器是一个使 SQL Server 数据库自动执行某些操作的特殊程序。

在执行特定的 SQL Server 数据库操作时,SQL Server 总是先运行触发器,然后再执行所请求的操作。

触发器可以执行各种操作,例如插入、更新或删除数据。

在编写一个 SQL Server 触发器时,可以使用 if else 语句来控制不同的操作。

If else 语句是 SQL Server 中常用的控制语句,可以根据指定的条件执行不同的操作。

在 SQL Server 触发器中,if else 语句可以用来控制触发器在满足特定条件时执行特定的 SQL 代码。

一个简单的 if else 语句可以如下所示:IF conditionBEGIN--执行操作AENDELSEBEGIN--执行操作BEND在 SQL Server 触发器中,if else 语句可以用于控制触发器执行特定的操作。

例如,可以在触发器中使用 if else 语句来检查特定的条件,然后基于该条件对目标表进行插入、更新或删除操作。

以下是一个在 SQL Server 触发器中使用 if else 语句的示例: CREATE TRIGGER trigger_nameON table_nameAFTER INSERT --触发器会在插入操作之后执行,其他操作类似ASBEGINDECLARE @var1 INT; --定义变量SET @var1 = (SELECT COUNT(*) FROM table_name); --将表中的行数赋给变量IF (@var1 > 10) --检查条件BEGIN--执行操作AUPDATE table_name SET column1='new_value' WHEREcolumn2='value2';ENDELSEBEGIN--执行操作BDELETE FROM table_name WHERE column3='value3';ENDEND;以上触发器将在插入操作之后执行,如果表中行数大于10,则更新列1,否则删除特定列的值。

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的触发器,如果存在,⾸先删除,再创建,触发器要求删除⼀门课程时候,⾸先判断该课程有否有⼈选,如果有⼈选,则不能删除,并通过测试数据验证该触发器的执⾏情况。

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.什么是触发器
赵二退休 删除
员工表

sqlserver 触发器if else语句

sqlserver 触发器if else语句

sqlserver 触发器if else语句在SQLServer中,触发器是一种特殊的存储过程,它们在数据库中的表上自动执行,通常用于在表上进行特定操作时执行其他操作。

在触发器中,可以使用 IF ELSE 语句以根据条件执行不同的操作。

以下是一个示例触发器,其中包含 IF ELSE 语句:CREATE TRIGGER [dbo].[trig_example]ON [dbo].[example_table]AFTER INSERT, UPDATE, DELETEASBEGIN-- Check if INSERTIF EXISTS (SELECT * FROM inserted)BEGINPRINT 'New rows added'-- Insert additional data into another tableINSERT INTO [dbo].[additional_table] (column1, column2) SELECT column3, column4 FROM insertedEND-- Check if UPDATEELSE IF EXISTS (SELECT * FROM deleted)BEGINPRINT 'Rows updated'-- Update data in another tableUPDATE [dbo].[additional_table] SET column1 =inserted.column3FROM [dbo].[additional_table]INNER JOIN inserted ON inserted.id =[dbo].[additional_table].idEND-- Check if DELETEELSEBEGINPRINT 'Rows deleted'-- Delete data from another tableDELETE FROM [dbo].[additional_table]WHERE id IN (SELECT id FROM deleted)ENDEND该触发器在 example_table 上创建,并根据 INSERT、UPDATE 和DELETE 操作执行不同的操作。

sqlserver触发器中获取触发触发器的这条sql语句

sqlserver触发器中获取触发触发器的这条sql语句

sqlserver触发器中获取触发触发器的这条sql语句
在SQL Server 中,你可以在触发器中使用CONTEXT_INFO()函数来获取触发触发器的SQL 语句。

CONTEXT_INFO()函数返回一个varbinary类型的值,该值包含了触发器执行的上下文信息。

以下是一个示例,演示如何在触发器中使用CONTEXT_INFO()函数来获取触发触发器的SQL 语句:
sql
CREATE TRIGGER MyTrigger
ON MyTable
AFTER INSERT, UPDATE, DELETE
AS
BEGIN
DECLARE@sql NVARCHAR(MAX);
SET@sql = CAST(CONTEXT_INFO() AS NVARCHAR(MAX));
PRINT @sql; -- 打印触发器执行的 SQL 语句
END;
在上述示例中,MyTrigger是触发器的名称,MyTable是触发器所在的表。

AFTER INSERT, UPDATE, DELETE表示触发器在插入、更新或删除操作之后执行。

在触发器的主体部分,我们使用SET语句将CONTEXT_INFO()函数的返回值转换
为NVARCHAR(MAX)类型的变量@sql。

然后,我们使用PRINT语句打印该变量的值,即触发器执行的SQL 语句。

请注意,CONTEXT_INFO()函数返回的上下文信息中包含了触发器执行的完整SQL 语句。

因此,如果你的触发器执行了多个SQL 语句,它们都会包含在返回的上下文信息中。

如果你只想获取特定的SQL 语句,你可能需要对返回的上下文信息进行进一步处理或解析。

sql server 触发器 的写法

sql server 触发器 的写法

sql server 触发器的写法SQL Server触发器是一种特殊类型的存储过程,其可以在指定的表上定义并绑定到表的INSERT、UPDATE或DELETE语句操作上。

当这些操作被执行时,触发器将会自动触发,并按照事先定义的逻辑执行相应的操作。

触发器可以用于实现数据完整性约束、数据审计、数据同步等应用场景。

下面,我将介绍SQL Server触发器的写法,包括触发器的创建、绑定和编写触发逻辑等。

1.创建触发器在SQL Server中,可以使用CREATE TRIGGER语句来创建触发器。

触发器的创建包括触发器的名称、关联的表以及触发事件(INSERT、UPDATE或DELETE)。

创建触发器的语法如下:CREATE TRIGGER trigger_nameON table_name[AFTER/INSTEAD OF] {INSERT, UPDATE, DELETE}ASBEGIN--触发器的逻辑代码END其中,trigger_name是触发器的名称,table_name是触发器所关联的表名,[AFTER/INSTEAD OF] {INSERT, UPDATE, DELETE}指定触发器关联的触发事件类型。

触发器的逻辑代码则位于BEGIN和END之间。

2.触发器的绑定创建触发器后,需要将其绑定到相应的表上。

可以使用ALTER TABLE语句来绑定触发器。

绑定触发器的语法如下:ALTER TABLE table_name{ADD/DROP} TRIGGER trigger_name其中,table_name是要绑定触发器的表名,{ADD/DROP} TRIGGER指定要添加或删除的触发器。

3.编写触发器逻辑触发器的逻辑代码可以包含SQL语句、流程控制语句以及用于操作内置函数和变量的语句。

触发器的逻辑代码应根据触发器所关联的事件类型进行编写。

下面是一些常见的触发器逻辑示例:3.1插入触发器逻辑当触发器关联插入事件时,可以使用INSERTED表来访问插入操作的数据。

SqlServer触发器的原理及案例

SqlServer触发器的原理及案例

SqlServer触发器的原理及案例SqlServer触发器的原理及案例合理的选⽤触发器会让你的系统更⾼效2010Ssc⽬录第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约束更复杂的限制。

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触发器(插⼊删除操作)插⼊触发器:例(触发器desk1)当表desk插⼊⼀条语句后,触发触发器desk1,之后向表booksheet中插⼊⼀条语句:create trigger desk1on deskafter insertasbegindeclare @Name_1 varchar(10),@Sex_1 nchar(2);declare @Phone_2 nchar(11);declare @Number_1 int,@Time_1 nvarchar(6),@Date_1 nvarchar(10);declare @Environment_1 nvarchar(6),@Phone_1 nchar(11),@id_1 int;select @Phone_2=Phone from inserted;select @Name_1= from userall where @Phone_2=userall.Phone;select @Sex_1=userall.Sex from userall where @Phone_2=userall.Phone;select @Number_1=Number, @Time_1=Time, @Date_1=Date, @Environment_1=Environment,@Phone_1=Phone,@id_1=id from inserted;insert into booksheet(Phone,Number,Time,Date,Environment,Name,Sex,id) values (@Phone_1,@Number_1,@Time_1,@Date_1,@Environment_1,@Name_1,@Sex_1,@id_1); end触发器有两个特殊的表:插⼊表(instered表)和删除表(deleted表)。

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

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列。

数据库开发-sql server触发器如何使用实例解析

数据库开发-sql server触发器如何使用实例解析

数据库开发-sql server触发器如何使用实例解析数据库开发-sql server触发器如何使用实例解析在数据库开发中,触发器是一种特殊的存储过程,它会在数据库表发生特定事件时自动执行。

触发器可以帮助我们实现数据的自动化处理和一些复杂的业务逻辑。

在本文中,我将详细介绍SQL Server触发器的使用实例,以帮助您更好理解和应用这一重要的数据库开发技术。

1. 触发器的基本概念在开始之前,让我们先来了解一下触发器的基本概念。

触发器是一种特殊的存储过程,它与数据库表相关联,并在表发生特定事件时自动执行。

这些特定事件包括INSERT、UPDATE和DELETE操作。

触发器可以在数据被修改之前或之后执行,这取决于触发器的类型,分为BEFORE和AFTER两种。

2. SQL Server触发器的创建在SQL Server中,我们可以使用CREATE TRIGGER语句来创建触发器。

以下是一个简单的创建触发器的示例:```sqlCREATE TRIGGER [触发器名称]ON [表名]FOR INSERT, UPDATE, DELETEASBEGIN-- 触发器的逻辑代码END```在上面的示例中,[触发器名称]表示触发器的名称,[表名]表示要关联的数据库表,FOR子句指定了触发器要响应的事件类型,AS子句中包含了触发器的逻辑代码。

3. 触发器的使用实例现在让我们来看一个实际的使用实例,假设我们有一个名为Student的表,其中包含了学生的尊称和芳龄信息。

我们想要在插入新的学生信息时,自动向另外一个名为StudentLog的表中插入一条日志信息,以便记录学生信息的变更历史。

我们可以通过触发器来实现这一功能。

```sqlCREATE TRIGGER trgAfterInsertON StudentAFTER INSERTASBEGININSERT INTO StudentLog (操作类型, 学生尊称, 操作时间)SELECT '新增', inserted.尊称, GETDATE()FROM insertedEND```在上面的示例中,我们创建了一个AFTER INSERT类型的触发器,当向Student表中插入新记录时,触发器会自动执行并向StudentLog 表中插入一条日志信息。

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),这两张表是逻辑表。

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

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

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

sql server中的删除触发器实例 -回复

sql server中的删除触发器实例 -回复

sql server中的删除触发器实例-回复"sql server中的删除触发器实例"在SQL Server中,触发器是一种特殊类型的存储过程,它会在特定的数据操作事件发生时自动触发。

触发器可以用于执行特定的业务逻辑或数据验证,以确保数据的一致性和完整性。

有时候,我们可能需要删除一个已经存在的触发器。

本文将逐步介绍在SQL Server中删除触发器的步骤。

第一步:查找要删除的触发器在SQL Server中,我们可以使用以下查询来查找要删除的触发器:sqlSELECT name, OBJECT_NAME(parent_object_id) AS TableName FROM sys.triggersWHERE OBJECTPROPERTY(parent_object_id, 'IsTable') = 1;这个查询将返回一个结果集,其中包含了所有数据库中表的触发器的名称和对应的表名。

根据需要删除的触发器的名称和所属表的信息,可以选择要删除的触发器。

第二步:禁用触发器在删除触发器之前,我们需要先禁用它。

通过禁用触发器,可以确保在删除触发器的过程中不会有其他事务对相关表进行操作。

要禁用触发器,我们可以使用以下命令:sqlALTER TABLE TableName DISABLE TRIGGER TriggerName;其中,"TableName"是要禁用触发器的表的名称,"TriggerName"是要禁用的触发器的名称。

第三步:删除触发器在禁用触发器之后,我们可以使用以下命令来删除触发器:sqlDROP TRIGGER TriggerName ON TableName;其中,"TriggerName"是要删除的触发器的名称,"TableName"是触发器所属的表的名称。

执行这个命令后,SQL Server将删除相应的触发器。

sql server中的删除触发器实例 -回复

sql server中的删除触发器实例 -回复

sql server中的删除触发器实例-回复SQL Server中的删除触发器实例SQL Server是一种关系型数据库管理系统,被广泛用于管理和存储大量的数据。

在SQL Server中,触发器是一种特殊的存储过程,它会在特定的数据操作(如插入、更新或删除)发生时自动执行。

触发器是用于实现数据完整性和业务逻辑的重要工具。

但是,有时我们可能需要删除一个已经存在的触发器。

本文将一步一步回答如何在SQL Server中删除触发器。

第一步:连接到SQL Server数据库在开始删除触发器之前,我们需要使用适当的工具连接到SQL Server 数据库。

可以使用SQL Server Management Studio (SSMS)或者通过命令行工具如SQLCMD进行连接。

确保你具有足够的权限来删除触发器,一般需要具备sysadmin、db_owner或db_ddladmin等角色权限。

第二步:选择合适的数据库在连接到SQL Server数据库之后,选择要删除触发器的数据库。

可以通过使用USE语句指定要使用的数据库,例如:USE [DatabaseName]将[DatabaseName]替换为实际数据库的名称。

第三步:查找要删除的触发器在确定要删除的数据库之后,需要查找要删除的触发器。

可以使用系统表sys.triggers或者使用sp_helptrigger存储过程来查找触发器的信息。

以下是通过查询sys.triggers表来查找触发器的示例:SELECT nameFROM sys.triggersWHERE parent_class_desc = 'DATABASE' 替换为具体对象类别这将返回所有与数据库相关的触发器的名称。

你可以根据触发器的名称和其他属性来判断你要删除的具体触发器。

第四步:删除触发器在确认要删除的触发器之后,可以使用DROP TRIGGER语句来删除触发器。

确认你使用的是正确的语法,并将触发器的名称替换为实际要删除的触发器的名称。

SQLServer创建触发器,更新表

SQLServer创建触发器,更新表

在SQLServer,触发器,插⼊、更新、删除状态: CREATE TRIGGER t_inms_alarms ON [PHS].[dbo].[AlarmCurrent] FOR INSERT, DELETE AS DECLARE @rows int SELECT @rows = @@rowcount IF @rows = 0 return --如果表是插⼊,则同步更新AlarmsMiddleTbl IF EXISTS(SELECT 1 FROM inserted) AND NOT EXISTS(SELECT 1 FROM deleted) BEGIN INSERT INTO [PHS].[dbo].[AlarmsMiddleTbl] SELECT i.[Id], i.[SequenceId], i.[code], i.[alarmdefineid], CONVERT(varchar,i.[occurTime],120), i.[confirmation], i.[ConfirmationTime], i.[MaintenanceName], i.[MaintenanceProcedure], i.[ClearTime], i.[screen],CONVERT(varchar, getdate(), 120) FROM inserted i END --如果表是更新某个字段,则同步更新AlarmsMiddleTbl IF NOT EXISTS(SELECT 1 FROM inserted) AND EXISTS(SELECT 1 FROM deleted) AND UPDATE(ConfirmationTime) BEGIN INSERT INTO [PHS].[dbo].[AlarmsMiddleTbl] SELECT d.[Id], d.[SequenceId], d.[code], d.[alarmdefineid], CONVERT(varchar,d.[occurTime],120), d.[confirmation], d.[ConfirmationTime], d.[MaintenanceName], d.[MaintenanceProcedure], CONVERT(varchar, getdate(),120), d.[screen],CONVERT(varchar, getdate(), 120) from deleted d END --如果表是删除,则同步更新AlarmsMiddleTbl IF NOT EXISTS(SELECT 1 FROM inserted) AND EXISTS(SELECT 1 FROM deleted) BEGIN INSERT INTO [PHS].[dbo].[AlarmsMiddleTbl] SELECT d.[Id], d.[SequenceId], d.[code], d.[alarmdefineid], CONVERT(varchar,d.[occurTime],120), d.[confirmation], d.[ConfirmationTime], d.[MaintenanceName], d.[MaintenanceProcedure], CONVERT(varchar, getdate(),120), d.[screen],CONVERT(varchar, getdate(), 120) from deleted d END IF @@error <> 0 BEGIN RAISERROR('ERROR',16,1) rollback transaction return END。

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

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
29DECLARE@userId INT
30--接受更新前用户密码的变量
31DECLARE@oldPwd VARCHAR(50)
32--接受更新后用户密码的变量
33DECLARE@newPwd VARCHAR(50)
34--接受更新前用户邮件的变量
35DECLARE@oldEmail VARCHAR(50)
36--接受更新后用户邮件的变量
37DECLARE@newEmail VARCHAR(50)
38--从DELETED临时表中获取数据更新前用户数据
39SELECT@userId=UserId,@oldPwd=password,@oldEmail=Em ail FROM Deleted
40--从INSERTED临时表中获取数据更新后的用户数据
41SELECT@newPwd=password,@newEmail=Email FROM Inserte d
42--向系统日志表中插入数据
43INSERT INTO managerlog VALUES('修改ID为:['+CAST(@use rId AS VARCHAR(5))+']用户信息:<br/>Password:{'+@oldPwd+'}-
->Password:{'+@newPwd+'}<br/>Email:{'+@oldEmail+'}-->{'+@ newEmail+'}',getDate())
44Go
45
46
47--创建当用户表插入新数据时,添加工资表对应记录的触发器
48IF EXISTS(SELECT*FROM sysobjects WHERE[xtype]='TR'AN D[name]='Insert_Emp_EmpPayment')
49DROP TRIGGER Insert_Emp_EmpPayment
50go
51CREATE TRIGGER Insert_Emp_EmpPayment
52ON Employee1
53FOR INSERT
54AS
55DECLARE@empId INT
56SELECT@empId=EmpId FROM Inserted
57INSERT INTO EmpPayMent VALUES(@empId,800.00,null) 58go
59
60--创建当向工资表插入数据时,更新工资表中员工奖金
61IF EXISTS(SELECT*FROM sysobjects WHERE[xtype]='TR'AN D[name]='Insert_EmpPayment')
62DROP TRIGGER Insert_EmpPayment
63go
64CREATE TRIGGER Insert_EmpPayment
65ON EmpPayMent
66FOR INSERT
67AS
68DECLARE@empId INT
69SELECT@empId=EmpId FROM Inserted
70UPDATE EmpPayMent SET Bonus=50.00WHERE EmpID=@empId 71go。

相关文档
最新文档