SQL trigger class notes

--创建触发器
--触发器 保证数据完整性,与表事件相关的特殊的存储过程,由事件触发
--比如当对一个表进行操作时(alter,delete,update)

DELETE Student
WHERE Sno='1201011102'

SELECT *
FROM Student
WHERE Sno='1201011102'

--插入一条新记录
INSERT INTO Student
(Sno,Sname,Ssex,EntranceTime,Classno)
VALUES 
('11099','字符串','男','2000-01-01','11010111')
--查询插入的新记录
SELECT *
FROM Student
WHERE Sno='11099'
--如果要真的删除,需要禁用表里面的delete_student触发器
DELETE Student
WHERE Sno='11099'


ALTER TRIGGER [dbo].[update_sname]
on [dbo].[Student]
FOR UPDATE  --INSTEAD OF UPDATE
AS
	IF UPDATE(Sname)
	BEGIN 
		PRINT '不能修改学生的姓名'
		ROLLBACK TRANSACTION
	END 
	ELSE IF UPDATE(Ssex)
	BEGIN 
		PRINT '不能修改学生的性别'
		ROLLBACK TRANSACTION --撤销操作
	END 


--测试代码,检查触发器功能是否正常
UPDATE Student
SET Sname ='zfc'
WHERE Sno='1101011101'

UPDATE Student
SET Ssex ='m'
WHERE Sno='1101011101'

SELECT *
FROM Student
WHERE Sno='1101011101'

--创建一个触发器,针对于teacher表,如果有人要修改教师的姓名,就输出不能修改教师姓名

CREATE TRIGGER T_UPDATENAME
ON Teacher --对Teacher表起作用
FOR UPDATE --触发条件,insert,delete
AS
	IF UPDATE(Tname)
	BEGIN 
		PRINT	'不能修改教师姓名'
		ROLLBACK TRAN	--事物回滚
	END

--测试代码,验证触发器是否有效
UPDATE Teacher
SET Tname='字符串'
WHERE Tno='0101'

SELECT *
FROM Teacher
WHERE Tno='0101'
--
ALTER TRIGGER T_INSERT
ON Teacher
FOR INSERT 
AS
--两张特殊的表,INSERTED ,DELETED(隐藏),记录刚刚插入或者删除的记录
DECLARE @Tno char(4) --定义的局部变量用来保存从系统表中查出的教师的工号
SELECT @Tno=Tno
FROM INSERTED
PRINT @Tno

	IF LEFT(@Tno,2)!='11'
		PRINT '不能插入该记录'
		ROLLBACK TRAN

--测试触发器语句
INSERT INTO Teacher
(Tno,Tname,Ttitle)
VALUES 
('0997','ZIFUCHUAN','教授')

Guess you like

Origin blog.csdn.net/csdcainiao/article/details/106678699