⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 示例-触发器2.sql

📁 用C语言如何编写多元线性回归
💻 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 + -