📄 示例-触发器2.sql
字号:
drop table 出库表
drop table 库存表
/******************************************************
* "库存表"的完整性实现:
* 1、产品号为主键,实现实体完整性
* 2、"出库表"引用本表,存在引用时不可删除
* 3、修改产品号时采用级联操作,自动修改各引用外键
* 4、在有引用的情况下,"数量"不允许直接修改,通过出入库修改
*******************************************************/
CREATE TABLE 库存表
( 产品号 char(6) PRIMARY KEY ,
产品名 char(10) NOT NULL,
库存数量 int NOT NULL DEFAULT 0
--其它列
)
/**************************************************
* "出库表"的完整性实现:
* 1、编号为主键,实现实体完整性
* 2、"产品号"为外键,实现引用完整性
***************************************************/
CREATE TABLE 出库表
(
编号 int IDENTITY PRIMARY KEY,
产品号 char(6) REFERENCES 库存表(产品号) ON UPDATE CASCADE,
出库日期 smalldatetime,
出库数量 int NOT NULL
--其它列
)
GO
--创建触发器实现出库自动更新库存数量
--假设每个语句只影响一行
--INSERT触发器
CREATE TRIGGER INSERT_出库表
ON 出库表 AFTER INSERT
AS
DECLARE @ID char(6), @num int
DECLARE @tmp int
SELECT @ID = 产品号, @num = 出库数量 FROM inserted
SELECT @tmp = 库存数量 FROM 库存表
WHERE 产品号 = @ID
IF @tmp - @num >= 0
BEGIN
UPDATE 库存表 SET 库存数量 = 库存数量 - @num
WHERE 产品号 = @ID
COMMIT TRAN
END
ELSE BEGIN
ROLLBACK TRANSACTION
RAISERROR('库存数量不够!',16,1)
END
GO
--DELETE触发器
CREATE TRIGGER DELETE_出库表
ON 出库表 AFTER DELETE
AS
DECLARE @ID char(6), @num int
DECLARE @tmp int
SELECT @ID = 产品号, @num = 出库数量 FROM deleted
UPDATE 库存表 SET 库存数量 = 库存数量 + @num
WHERE 产品号 = @ID
GO
--UPDATE触发器
CREATE TRIGGER UPDATE_出库表
ON 出库表 AFTER UPDATE
AS
DECLARE @ID char(6), @num int
DECLARE @ID1 char(6),@num1 int
DECLARE @tmp int
SELECT @ID1 = 产品号, @num1 = 出库数量 FROM deleted
SELECT @ID = 产品号, @num = 出库数量 FROM inserted
UPDATE 库存表 SET 库存数量 = 库存数量 + @num1
WHERE 产品号 = @ID1
SELECT @tmp = 库存数量 FROM 库存表
WHERE 产品号 = @ID
IF @tmp >= @num
BEGIN
UPDATE 库存表 SET 库存数量 = 库存数量 - @num
WHERE 产品号 = @ID
COMMIT TRAN
END
ELSE BEGIN
ROLLBACK TRANSACTION
RAISERROR('库存数量不够!',16,1)
END
GO
------创建触发器实现库存表的操作限制------
CREATE TRIGGER UPDATE_库存表
ON 库存表 AFTER UPDATE
AS
IF UPDATE(库存数量)
BEGIN
DECLARE @ID char(6)
SELECT @ID = 产品号 FROM deleted
IF EXISTS(SELECT * FROM 出库表 WHERE 产品号 = @ID)
BEGIN
ROLLBACK TRANSACTION
RAISERROR('不可修改当前库存数量!',16,1)
END
END
GO
--表中插入测试数据验证完整性
INSERT INTO 库存表 VALUES('01','计算机',10)
INSERT INTO 库存表 VALUES('02','电视机',20)
INSERT INTO 库存表 VALUES('03','DVD',30)
GO
sp_configure 'nested triggers',0
GO
RECONFIGURE
--检查触发器
SELECT * FROM 库存表
SELECT * FROM 出库表
--INSERT 出库表 VALUES('01','2006-3-20',2)
--INSERT 出库表 VALUES('02','2006-3-20',7)
--UPDATE 出库表 SET 产品号 = '01', 出库数量 = 5 WHERE 编号 = 2
--DELETE 出库表 where 编号 = 2
--UPDATE 库存表 SET 库存数量 = 50 WHERE 产品号 = '10'
--UPDATE 库存表 SET 库存数量 = 20 WHERE 产品号 = '01'
--UPDATE 库存表 SET 产品号 = '05' WHERE 产品号 = '01'
--DELETE 库存表 WHERE 产品号 = '03'
--DELETE 库存表 WHERE 产品号 = '05'
GO
SELECT * FROM 库存表
SELECT * FROM 出库表
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -