triggerdemo11.sql

来自「T-SQL示例大全」· SQL 代码 · 共 68 行

SQL
68
字号
/* 
文件名称: TriggerDemo11.sql
目        的: 使用 INSTEAD OF 触发程序去防止发生违反条件约束的事情
*/
USE 北风贸易
GO
if exists (select * from dbo.sysobjects where id = object_id(N'MyTable') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table MyTable
GO

CREATE TABLE MyTable
(
编号 nchar(5) NOT NULL PRIMARY KEY CLUSTERED,
姓名 nvarchar(12) NOT NULL ,
薪资 money NOT NULL 
) 
GO

-- 为 MyTable 数据表建立一个 CHECK 条件约束
ALTER TABLE MyTable WITH NOCHECK ADD 
     CONSTRAINT CK_MyTable_薪资 CHECK (薪资 >= 15000 and 薪资 <= 120000)
GO

-- 为 MyTable 数据表建立一个由新增作业引发执行的触发程序
CREATE TRIGGER InsertTriggerOfMyTable ON MyTable
INSTEAD OF INSERT
AS
DECLARE @TmpTable TABLE (
                                                     编号 nchar(5),
                                                     姓名 nvarchar(12) ,
                                                     薪资 money
                                                     )
INSERT @TmpTable SELECT * FROM inserted

-- 将低于下限值的薪资设定成下限值,
-- 并将高于上限值的薪资设定成上限值
UPDATE @TmpTable SET 薪资 = 
                                           CASE WHEN 薪资< 15000 THEN 15000
                                                      WHEN 薪资> 120000 THEN 120000
                                                       ELSE 薪资
                                            END

INSERT MyTable SELECT * FROM @TmpTable

GO

/*--------------- 开始新增数据记录 ---------------*/

SET NOCOUNT ON

INSERT MyTable VALUES ('A0001','章立民',30000)
GO

-- 虽然这个数据违反薪资的条件约束(低于下限值),但是
-- 通过 INSTEAD OF 触发程序的处理,所以仍然会被新增
INSERT MyTable VALUES ('A0002','洪志豪',0)
GO

-- 虽然这个数据违反薪资的条件约束(高于上限值),但是
-- 通过 INSTEAD OF 触发程序的处理,所以仍然会被新增
INSERT MyTable VALUES ('A0003','刘大胜',3000000000)
GO

-- 查看数据表 MyTable 的数据记录
SELECT * FROM MyTable
GO

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?