sql触发器实例
SQL 触发器发例发解 1
SQL触发器发例1
定发, 何发发器,在触SQL Server里面也就是发某一
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
的一定的操作~发某发件~而发行个触条从
的一段程序。发器是一特殊的存发发程。 触个
常发的发器有三发,分发发用于触Insert , Update , Delete 事件。
我发什发要使用发器,比如~发发表, 触两个
Create Table Student( --学生表
StudentID int primary key, --学号
....
)
Create Table BorrowRecord( --学生借发发发表
BorrowRecord int identity(1,1), --流水号
StudentID int , --学号
BorrowDate datetime, --借出发发
ReturnDAte Datetime, --发发发发
...
)
用到的功能有:
1.如果我更改了生的学学号,我希望他的借发发发仍然发发发生相发与个学(也就是同发更改借发发发表的学号);
2.如果发生已发发发~我希望发除他的的同发~也发除的借发发发。 学学号它
等等。
发发候可以用到发器。发于触1~发建一个Update触发器,
Create Trigger truStudent
On Student --在Student表中发建发器 触
for Update --发什发事件发 触
As --事件发后所要做的事情 触
if Update(StudentID)
begin
Update BorrowRecord
Set StudentID=i.StudentID
From BorrowRecord br , Deleted d ,Inserted i --Deleted和Inserted发发表
Where br.StudentID=d.StudentID
end
理解发器里面的发发的表,触两个Deleted , Inserted 。注意Deleted 与Inserted分发表示触旧条条发事件的表“的一发发”和“新的一发发”。
一据发系发中有发表用于存发在表中发发改发的信息~分发是, 个数两个虚
虚发表Inserted 虚发表Deleted 在表发发新增发 存放新增的发发 不存发发发
修改发 存放用更新的新发发来 存放更新前的发发
发除发 不存发发发 存放被发除的发发
一个Update 的发程可以看作发,生成新的发发到Inserted表~发制的发发到旧Deleted表~然
后发除Student发发入新发发。 并写
发于2~发建一个Delete触发器
Create trigger trdStudent
On Student
for Delete
As
Delete BorrowRecord
From BorrowRecord br , Delted d
Where br.StudentID=d.StudentID
从两个发例子我发可以看到了发发器的发发,触A.2个发发的表~B.触发机制。 SQL触发器发例2
/*
建立发发发发境~包含,表虚[卷烟发存表]~表[卷烟发表售]。
发大家注意踪发表的据~发器到底发行了什发发发发发~发据有什发影。 跟两个数体会触数响
发了能更的表述发器的作用~表发存在据冗余~且不符合第三范式~发里特此发明。 清晰触构数
*/
USE Master
GO
IF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE XTYPE = ’U’ AND NAME = ’
卷烟发存表’)
DROP TABLE 卷烟发存表
GO
IF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE XTYPE = ’U’ AND NAME = ’
卷烟发表’售)
DROP TABLE 卷烟发表 售
GO
--发发发发,发金发 售= 发量 售数* 发发价 发发发发。 售
CREATE TABLE 卷烟发表 售
(
卷烟品牌 VARCHAR(40) PRIMARY KEY NOT NULL, 发发商 VARCHAR(40) NULL,
发量 售数INT NULL,
发发价 售MONEY NULL,
发金发 售MONEY NULL
)
GO
--发发发发,发存金发 = 发存量 数* 发存发价 发发发发。
CREATE TABLE 卷烟发存表
(
卷烟品牌 VARCHAR(40) PRIMARY KEY NOT NULL, 发存量 数INT NULL,
发存发价 MONEY NULL,
发存金发 MONEY NULL
)
GO
--发建发器~示例触1
/*
发建发器触[T_INSERT_卷烟发存表]~发发器发发发。 个触
发明, 每当[卷烟发存表]发生 INSERT 发作~发引发发发器。 触
触插数发器功能, 强制发行发发发发~保发入的据中~发存金发 = 发存量 数* 发存发价。 注意, [INSERTED]、[DELETED]发系发表~不可发建、修改、发除~但可以发用。 重要, 发系发表的发同入据的表的发。 两个构插数构
*/
IF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE XTYPE = ’TR’ AND NAME =
’T_INSERT_卷烟发存表’)
DROP TRIGGER T_INSERT_卷烟发存表
GO
CREATE TRIGGER T_INSERT_卷烟发存表
ON 卷烟发存表
FOR INSERT
AS
--提交事发发理
BEGIN TRANSACTION
--强制发行下列发句~保发发发发发
UPDATE 卷烟发存表
SET 发存金发 = 发存量 数* 发存发价
WHERE 卷烟品牌 IN (SELECT 卷烟品牌 from INSERTED) COMMIT TRANSACTION
GO
/*
发发[卷烟发存表]~入发发据, 插数
注意~第一据;发塔山新发力,中的据符合发发发发~ 条数数
第二据;发塔山人发峰,中~条数[发存金发]空~不符合发发发发~ 第三据;云南映像,中~条数[发存金发]不等于[发存量数]乘以[发存发价]~不符合发发发发。
第四据发存量发条数数0。
发注意在入据后~发发插数[卷烟发存表]中的据是否 发存金发 数= 发存量 数* 发存发价。 */
INSERT INTO 卷烟发存表(卷烟品牌,发存量数,发存发价,发存金发) SELECT ’发塔山新发力’,100,12,1200 UNION ALL SELECT ’发塔山人发峰’,100,22,NULL UNION ALL SELECT ’云南映像’,100,60,500 UNION ALL SELECT ’玉溪’,0,30,0
GO
--发发据 数
SELECT * FROM 卷烟发存表
GO
/*
发果集
RecordId 卷烟品牌 发存量 发存发价 发存金发 数
-------- ------------ -------- ------- ---------
1 发塔山新发力 100 12.0000 1200.0000 2 发塔山人发峰 100 22.0000 2200.0000 3 云南映像 100 60.0000 6000.0000 4 玉溪 0 30.0000 .0000
;所影的行发 响数4 行,
*/
--触发器示例2
/*
发建发器触[T_INSERT_卷烟发表售]~发发器发发发。 触
发明: 每当[卷烟发存表]发生 INSERT 发作~发引发发发器。 触
触发器功能, 发发发发发发。
发发发发: 如果发的卷烟品牌不存在发存或者发存发零~发返回发发。 售
否发发自发少减[卷烟发存表]中发发品牌卷烟的发存量和发存金发。 数
*/
IF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE XTYPE = ’TR’ AND NAME =
’T_INSERT_卷烟发表’售)
DROP TRIGGER T_INSERT_卷烟发表 售
GO
CREATE TRIGGER T_INSERT_卷烟发表 售
ON 卷烟发表 售
FOR INSERT
AS
BEGIN TRANSACTION
--发发据的合法性,发的卷烟是否有发存~或者发存是否大于零 数售
IF NOT EXISTS (
SELECT 发存量 数
FROM 卷烟发存表
WHERE 卷烟品牌 IN (SELECT 卷烟品牌 FROM INSERTED)
)
BEGIN
--返回发发提示
RAISERROR(’发发,发卷烟不存在发存~不能发。’售,16,1) --回发事发
ROLLBACK
RETURN
END
IF EXISTS (
SELECT 发存量 数
FROM 卷烟发存表
WHERE 卷烟品牌 IN (SELECT 卷烟品牌 FROM INSERTED) AND
发存量 数<= 0
)
BEGIN
--返回发发提示
RAISERROR(’发发,发卷烟发存小于等于0~不能发。’售,16,1) --回发事发
ROLLBACK
RETURN
END
--发合法的据发行发理 数
--强制发行下列发句~保发发发发发
UPDATE 卷烟发表 售
SET 发金发 售= 发量 售数* 发发价 售
WHERE 卷烟品牌 IN (SELECT 卷烟品牌 FROM INSERTED) DECLARE @卷烟品牌 VARCHAR(40)
SET @卷烟品牌 = (SELECT 卷烟品牌 FROM INSERTED) DECLARE @发量 售数MONEY
SET @发量 售数= (SELECT 发量 售数FROM INSERTED) UPDATE 卷烟发存表
SET 发存量 数= 发存量 数- @发量售数,
发存金发 = (发存量 数- @发量售数)*发存发价
WHERE 卷烟品牌 = @卷烟品牌
COMMIT TRANSACTION
GO
--发大家自行踪跟[卷烟发存表]和[卷烟发表售]的据发化。 数
--发发[卷烟发表售]~入第一发发据~发发据是正常的。 插条数数
INSERT INTO 卷烟发表售(卷烟品牌,发发商,发量售数,发发价售,发金发售) SELECT ’发塔山新发力’,’某发发商’,10,12,1200 GO
--发发[卷烟发表售]~入第二发发据~发据 发金发 不等于 发发发价 插条数数售售* 发量。 售数--触将数售售发器自发更正据~使 发金发 等于 发发价 * 发量。 售数INSERT INTO 卷烟发表售(卷烟品牌,发发商,发量售数,发发价售,发金发售) SELECT ’发塔山人发峰’,’某发发商’,10,22,2000 GO
--发发[卷烟发表售]~入第三发发据~发据中的卷烟品牌在 卷烟发存表中发不到发发。 插条数数找
--触将发器发发。
INSERT INTO 卷烟发表售(卷烟品牌,发发商,发量售数,发发价售,发金发售) SELECT ’发河V8’,’某发发商’,10,60,600
GO
/*
发果集
服发器: 消息 50000~发发 16~发 状1~发程 T_INSERT_卷烟发表~行 售15 发发,发卷烟不存在发存~不能发。 售
*/
--发发[卷烟发表售]~入第三发发据~发发据中的卷烟品牌在 卷烟发存表中发存发插条数数0。
--触将发器发发。
INSERT INTO 卷烟发表售(卷烟品牌,发发商,发量售数,发发价售,发金发售) SELECT ’玉溪’,’某发发商’,10,30,300
GO
/*
发果集
服发器: 消息 50000~发发 16~发 状1~发程 T_INSERT_卷烟发表~行 售29 发发,发卷烟发存小于等于0~不能发。 售
*/
--发发据 数
SELECT * FROM 卷烟发存表
SELECT * FROM 卷烟发表 售
GO
/*
发充,
1、本示例主要通发一发发的发发发发发发发行发器使用的发明~具的要根据需要活发理~ 个来触体灵
2、发于发器要理解用好 触并运INSERTED ~DELETED 两个系发表~ 3、本示例发建的发器都是 触FOR INSERT ,具的发法可考, 体参
Trigger发法
CREATE TRIGGER trigger_name ON { table | view }
[ WITH ENCRYPTION ] --用于加密发器 触
{
{ { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] }
[ 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 ]
}
}
4、发于发器~发发发注意 触
(1)、DELETE 触发器不能捕发 TRUNCATE TABLE 发句。
(2)、发器中不允发以下 触Transact-SQL 发句,
ALTER DATABASE CREATE DATABASE DISK INIT DISK RESIZE DROP DATABASE LOAD DATABASE LOAD LOG RECONFIGURE RESTORE DATABASE RESTORE LOG
(3)、发器最多可以嵌套 触32 发。
*/
--修改发器 触
--发发上~是 将CREATE TRIGGER ... 修改发 ALTER TRIGGER ...即可。 --发除发器 触
DROP TRIGGER xxx
GO
--发除发发发境
DROP TABLE 卷烟发存表
GO
DROP TABLE 卷烟发表 售
GO
DROP TRIGGER T_INSERT_卷烟发存表
GO
DROP TRIGGER T_INSERT_卷烟发表 售
GO
##################################################
################
触发器的基发知发和例子
,create trigger tr_name
on table/view
{for | after | instead of } [update][,][insert][,][delete]
[with encryption]
as {batch | if update (col_name) [{and|or} update (col_name)] }
发明,
1 tr_name ,发器名 触称
2 on table/view ,发器所作用的表。一发器只能作用于一表 触个触个
3 for 和after ,同发
4 after 与instead of :sql 2000新增发目afrer 与 instead of 的发 区After
在发事件发生以后才被激活触,只可以建立在表上
Instead of
代替了相发的发事件而被发行触,既可以建立在表上也可以建立在发发上 5 insert、update、delete,激活发器的三发操作~可以同发发行~也可发其一 触
6 if update (col_name),表明所作的操作发指定列是否有影~有影~发激活发器。此外响响触~
因发delete 操作只发行有影~ 响
所以如果使用delete操作就不能用发发句了条(发然使用也不出发~但是不能激活发器~意发触没)。
7 触两个发器发行发用到的特殊表,deleted ,inserted deleted 和inserted 可以发是一发特殊的发发表~是在发行激活发器发由系发自发生成的~其发触构与触发器作用的表发是一 构
发的~只是存放 的据有差。 数异
发
下面
表格
关于规范使用各类表格的通知入职表格免费下载关于主播时间做一个表格详细英语字母大小写表格下载简历表格模板下载
发明deleted 与inserted 数异据的差
deleted 与inserted 数异据的差
Inserted
存放发行insert和update 操作后的据 数
Deleted
存放发行delete 和update操作前的据 数
注意,update 操作相于先发行当delete 再发行insert ,所以在发行update操作发~修改前的数
据拷发一到条deleted 表中~修改后
的据在存到发器作用的表的同发~也同发生成一拷发到数触条insered表中