SQL-UPDATE触发器练习

&练习一

如下所示三张表( student,grade,student_updata_before ):

student表

grade表

Student_update_before表

# 触发器需要实现一下要求:修改学生信息后,将修改前的学生信息添加到student_updata_before表中,并记录操作的用户ip和修改时间。

触发器如下(如有问题,欢迎指出):

 1 CREATE TRIGGER Up_stu
 2 ON student
 3 FOR UPDATE
 4 AS
 5 IF ( SELECT COUNT(1) FROM inserted ) > 1
 6 BEGIN
 7     RAISERROR('每次只能更新一条数据',16,10);
 8     ROLLBACK;
 9 END
10 ELSE
11 BEGIN
12     DECLARE @Ubsid int,@O_sid int,@O_sname varchar(20),@O_sage int,@O_sgname varchar(20),@inf varchar(20),@test varchar(100);
13     SELECT @inf = USER_NAME();
14     SELECT TOP 1 @O_sid=Sid,@O_sname=Sname,@O_sage=Sage,@O_sgname=Sg_name FROM deleted;
15     SET @test ='USER:'+ @inf +'|Old Data:'+ CONVERT(varchar,@O_sid) +'/'+ @O_sname +'/'+ CONVERT(varchar,@O_sage) +'/'+ @O_sgname;
16     IF (SELECT COUNT(1) FROM Student_update_before) = 0
17         SET @Ubsid = 1;
18     ELSE
19         SET @Ubsid = (SELECT MAX(Ubsid) FROM Student_update_before) + 1;
20     INSERT INTO Student_update_before VALUES(@Ubsid,@test,GETDATE());
21 END
22 GO

#  触发器需要实现一下要求:修改学生信息时,不能修改学生的学号信息。

触发器如下(如有问题,欢迎指出):

CREATE TRIGGER tgr_student_up_column
ON student
FOR UPDATE
AS
--列级触发器:是否更新了学生学号
IF (UPDATE(Sid))
BEGIN
    RAISERROR('系统提示:学生学号不能修改!', 16, 11);
    rollback;
END
go

 

&练习二

#准备工作:创建员工employee表、部门变动历史dept_history表,工资变动历史sal_history表

#1,创建员工employee表:

CREATE TABLE employee(
    eid varchar(20) PRIMARY KEY,
    ename varchar(20),
    dept varchar(20),
    salary int,
    uptime date,
    status int   -- 状态(1表示在职,0表示离职)
)
go

#2,创建部门变动历史dept_history表

1 CREATE TABLE dept_history(
2     did int identity(1,1) primary key,
3     eid varchar(20),
4     olddept varchar(20),
5     newdept varchar(20),
6     uptime date,
7     FOREIGN KEY(eid) REFERENCES employee(eid)
8 )
9 go

#3,创建工资变动历史sal_history表

CREATE TABLE sal_history(
    sid int identity(1,1) primary key,
    eid varchar(20),
    oldsal varchar(20),
    newsal varchar(20),
    uptime date,
    FOREIGN KEY(eid) REFERENCES employee(eid)
)
go

触发器实现功能:当新职工入职时,员工信息表将插入1条数据。同时,触发器在部门变动历史中增加1条记录,其中olddept值为null;在工资变动历史中增加1条记录,其中oldsal值为0。

触发器如下(如有问题,欢迎指出):

 1 CREATE TRIGGER Up_em
 2 ON employee
 3 FOR UPDATE
 4 AS
 5 IF ( SELECT COUNT(1) FROM DELETED ) > 1
 6 BEGIN
 7     RAISERROR('每次只能更新一条数据!请重新输入!',16,10)
 8 END
 9 ELSE
10 BEGIN
11     DECLARE @eid varchar(20),@olddept varchar(20),@newdept varchar(20),@oldsal int,@newsal int,@status int;
12     SELECT TOP 1 @olddept = dept,@oldsal = salary FROM deleted;    
13     SELECT TOP 1 @eid = eid,@newdept = dept,@newsal = salary,@status = status FROM inserted;
14     IF NOT EXISTS (SELECT 1 FROM employee WHERE eid = @eid)    
15     BEGIN
16         RAISERROR('当前要更新的数据不存在,请插入后进行更新!',16,10);
17         ROLLBACK;    
18     END    
19     ELSE 
20     BEGIN
21         IF @olddept <> @newdept OR @status = 0
22             INSERT INTO  dept_history (eid,olddept,newdept,uptime) values(@eid,@olddept,@newdept,GETDATE());    
23         IF     @oldsal <> @newsal OR @status = 0
24             INSERT INTO  sal_history (eid,oldsal,newsal,uptime) values(@eid,@oldsal,@newsal,GETDATE());
25     END        
26 END

 

posted @ 2021-08-31 15:30  Mra_m  阅读(380)  评论(0编辑  收藏  举报