SQL SERVER触发器问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_31965095/article/details/72371455

定义一个触发器,为教师表TEACHER定义完整性规则“教授的工资不得低于4000元,如果低于4000 元,自动改为4000元”。 

CREATE TRIGGER Insert_Or_Update_Sal 
BEFORE INSERT OR UPDATE ON Teacher 
FOR EACH ROW 
AS BEGIN 
	IF(new.Job=‘教授’)AND(new.Sal<4000) THEN 
	new.Sal:=4000; 
	END IF; 
END;

课本上的例子是oracle数据库的写法,粘贴到sql server数据库上时会报错!百度上的许多改法都行不通,自己去图书馆查资料码了SQL SERVER的触发器的写法。


--新建teacher表
CREATE TABLE TEACHER(
	TNO INT,
	TNAME CHAR(10),
	TJOB NVARCHAR(10),
	SALARY INT
);
--BEFORE级触发器
ALTER TRIGGER insert_or_update_sal 
ON TEACHER
INSTEAD OF UPDATE,INSERT
AS
DECLARE @TNO INT,
		@TNAME CHAR(10),
		@TJOB NVARCHAR(10),
		@SALARY INT
BEGIN
	SELECT @TNO = TNO, @TNAME =TNAME, @TJOB = TJOB, @SALARY = SALARY FROM inserted;--从inserted表中取出修改的数据
	IF EXISTS(SELECT * FROM TEACHER WHERE TNO=(SELECT TNO FROM INSERTED)) AND ( @TJOB = N'教授') AND (@SALARY < 4000)--当修改表中教授工资时,如果小于4000,则修改成4000
	BEGIN
		update TEACHER set SALARY = 4000 where Teacher.TNO = @TNO;
	END
	ELSE IF EXISTS(SELECT * FROM TEACHER WHERE TNO=(SELECT TNO FROM INSERTED))--否则,则按原操作修改
	BEGIN
		UPDATE TEACHER set TNAME=@TNAME, TJOB=@TJOB, SALARY = @SALARY WHERE TEACHER.TNO = @TNO;
	END
	ELSE IF NOT EXISTS(SELECT * FROM TEACHER WHERE TNO=(SELECT TNO FROM INSERTED)) AND ( @TJOB = N'教授') AND (@SALARY < 4000)--当插入教授数据时,如果工资小于4000,则修改成4000
	BEGIN
		INSERT TEACHER VALUES(@TNO, @TNAME, @TJOB, 4000);
	END
	ELSE IF NOT EXISTS(SELECT * FROM TEACHER WHERE TNO=(SELECT TNO FROM INSERTED))--否则,则按原操作插入
	BEGIN
		INSERT TEACHER VALUES(@TNO, @TNAME, @TJOB, @SALARY);
	END
END


上面代码已经过测试,update&insert操作都没问题!希望能帮到后来学习数据库相关课程的同学。

猜你喜欢

转载自blog.csdn.net/qq_31965095/article/details/72371455