【SQL开源代码栏目提醒】:网学会员为需要SQL开源代码的朋友们搜集整理了CH18.sql相关资料,希望对各位网友有所帮助!
-- P18-8
CREATE TRIGGER 订单异动通知
ON 订单T1
AFTER INSERT, UPDATE
AS
PRINT '又有订单异动了!'
GO
CREATE TRIGGER 订单删除通知
ON 订单T1
AFTER DELETE
AS
PRINT '又有订单被删除了!'
GO
INSERT 订单T1 (日期, 客户编号)
VALUES ('2006/1/1', 3)
DELETE 订单T1
WHERE 日期 = '2006/1/1'
-- P18-9
EXEC sp_helptrigger '订单T1', 'DELETE'
-- P18-10a
EXEC sp_help 订单删除通知
-- P18-10b
EXEC sp_helptext 订单删除通知
-- P18-10c
EXEC sp_depends 订单删除通知
-- P18-11
EXEC sp_depends fnTestDepends
-- P18-14
CREATE TRIGGER 测试异动笔数
ON 客户T1
FOR DELETE, INSERT, UPDATE
AS
PRINT '异动了 ' + CAST(@@ROWCOUNT AS VARCHAR) + ' 笔资料!'
ROLLBACK
GO
INSERT 客户T1 (客户名称, 地址)
VALUES ('杨小头', '新竹市中山路')
GO
DELETE 客户T1
WHERE 客户编号 < 5
GO
DELETE 客户T1
WHERE 客户编号 >200
-- P18-16
INSERT 客户T1 (客户名称, 地址)
VALUES ('杨小头', '新竹市中山路')
DELETE 客户T1
WHERE 客户编号 < 5
-- P18-17
CREATE TRIGGER 检查数量是否更改
ON 订单T2
AFTER UPDATE, INSERT
AS
IF UPDATE(数量)
PRINT '数量栏已更改!'
ELSE
PRINT '数量栏没有更改!'
ROLLBACK
GO
UPDATE 订单T2
SET 数量 =5
WHERE 订单编号 = 10
GO
UPDATE 订单T2
SET 是否付款 = 1
WHERE 订单编号 = 11
-- P18-18
INSERT 订单T2 (日期, 客户编号)
VALUES ('2005/11/30', 5)
-- P18-19
CREATE TRIGGER 不允许修改日期
ON 订单T2
AFTER UPDATE
AS
IF UPDATE(日期)
BEGIN
PRINT '不可修改日期!'
ROLLBACK
END
GO
-- P18-20
RAISERROR('任何人都不能修改上限!', 16, 1)
-- P18-22
CREATE TRIGGER 检查订购数量
ON 订单T3
AFTER INSERT
AS
IF (SELECT 数量 FROM inserted) > 200
BEGIN
PRINT '数量不得大于 200!'
ROLLBACK
END
GO
INSERT 订单T3 (日期, 客户编号, 数量)
VALUES ('2005/11/30', 5, 201)
-- P18-23
INSERT INTO 订单T3
(日期, 客户编号, 数量, 是否付款)
SELECT 日期, 客户编号, 数量, 是否付款
FROM 订单T2
-- P18-24a
CREATE TRIGGER 检查订购数量更改
ON 订单T3
AFTER UPDATE
AS
IF (SELECT MAX(数量) FROM inserted) > 200
BEGIN
PRINT '数量更改不得大于 200!'
ROLLBACK
END
GO
UPDATE 订单T3
SET 数量 = 数量 + 30
-- P18-24b
CREATE TRIGGER 检查订购数量变化
ON 订单T3
AFTER UPDATE
AS
IF (SELECT MAX(ABS(新.数量 - 旧.数量))
FROM inserted AS 新 JOIN deleted AS 旧
ON 新.订单编号 = 旧.订单编号) > 50
BEGIN
PRINT '数量变化不得大于 50!'
ROLLBACK
END
GO
UPDATE 订单T3
SET 数量 = 数量 / 2
-- P18-25
CREATE TRIGGER 检查数量及日期
ON 订单T3
AFTER UPDATE
AS
IF UPDATE(数量)
BEGIN
IF (SELECT MAX(数量) FROM inserted) > 200
BEGIN
PRINT '数量不得大于 200!'
ROLLBACK TRANSACTION
RETURN
END
END
IF UPDATE(日期)
BEGIN
IF (SELECT MIN(日期) FROM inserted) < '2005/1/1'
BEGIN
PRINT '日期不得早于 2005/1/1!'
ROLLBACK TRANSACTION
END
END
GO
UPDATE 订单T3
SET 日期= '1999/1/1'
WHERE 订单编号 = 3
-- P18-26
CREATE TRIGGER 检查删除数量及日期
ON dbo.订单T3
AFTER DELETE
AS
select * from deleted
IF (SELECT SUM(数量) FROM deleted) > 300
BEGIN
ROLLBACK
RAISERROR('每次删除之订货总数量不得大于300!', 16, 1)
END
ELSE IF (SELECT MIN(日期) FROM deleted) < '2005/7/1'
BEGIN
ROLLBACK
RAISERROR('2005/7/1 之前的订单不得删除!', 16, 1)
END
GO
DELETE 订单T3
WHERE 数量 > 100
GO
PRINT '-------------------------'
DELETE 订单T3
WHERE 日期 < '2005/7/5'
-- P18-27
CREATE TRIGGER 订单异动邮寄通知
ON 订单T4
AFTER INSERT, UPDATE, DELETE
AS
EXEC master.dbo.sp_send_dbmail
@recipients = '
mis@flag.com.tw',
@body = '订单资料被更改了!',
@subject = '资料库异动通知'
-- P18-28
CREATE TRIGGER 检查上下限
ON 订单T5
FOR INSERT, UPDATE
AS
IF @@ROWCOUNT = 0 RETURN
IF UPDATE(数量)
BEGIN
IF EXISTS (SELECT A.*
FROM inserted A
JOIN 客户T5 B ON A.客户编号 = B.客户编号
JOIN 客户信用额度T5 C ON B.信用等级 = C.信用等级
WHERE A.数量 NOT BETWEEN C.下限 AND C.上限)
BEGIN
ROLLBACK TRANSACTION
RAISERROR('订购数量不符合客户的信用等级', 16, 1)
END
END
GO
INSERT 订单T5 (日期, 客户编号, 数量)
VALUES ( GETDATE(), 5, 201)
-- P18-29
CREATE TRIGGER 记录薪资修改
ON 员工T1
AFTER UPDATE
AS
IF @@ROWCOUNT = 0 RETURN
IF UPDATE(薪资)
BEGIN
INSERT 员工记录 (异动日期, 员工编号, 薪资)
SELECT GETDATE(), 员工编号, 薪资
FROM deleted
END
-- P18-30
EXEC sp_settriggerorder '记录薪资修改', 'First', 'UPDATE'
-- P18-31
EXEC sp_dboption 练习02, 'recursive triggers', 'true'
-- P18-34
CREATE TRIGGER 处理新增的员工资料
ON 员工T2
INSTEAD OF INSERT
AS
SET NOCOUNT ON -- 不要显示 '(影响 ? 个资料列)' 讯息
-- 更新已存在于【员工T2】中的资料
UPDATE 员工T2
SET 员工T2. = inserted.,
员工T2.薪资= inserted.薪资
FROM 员工T2 JOIN inserted
ON 员工T2.员工编号 = inserted.员工编号
PRINT '更改已存在的资料 ' + CAST(@@ROWCOUNT AS VARCHAR) + ' 笔'
-- 插入不存在于【员工T2】中的新资料
INSERT 员工T2
SELECT *
FROM ins