题目
初答(有误)
CREATE TRIGGER tri_zc ON 教师表
FOR INSERT, UPDATE
AS
BEGIN
UPDATE 部门表
SET 高级职称人数 = 高级职称人数 + 1
WHERE INSERTED.高级职称 = '教授' OR INSERTED.高级职称 = '副教授'
AND INSERTED.所在部门号 = 部门号
END
参考解答(有误)
实操(正确)
建表
IF NOT EXISTS (SELECT name FROM SYS.DATABASES WHERE name = '教学' )
CREATE DATABASE 教学
GO
USE 教学
IF NOT EXISTS (SELECT NAME FROM sysobjects WHERE NAME = '教师表')
CREATE TABLE 教师表
(
教师号 int PRIMARY KEY,
姓名 varchar(10),
所在部门号 varchar(4),
职称 varchar(10)
)
GO
IF NOT EXISTS (SELECT NAME FROM sysobjects WHERE NAME = '部门表')
CREATE TABLE 部门表
(
部门号 varchar(4) PRIMARY KEY,
部门名 varchar(10),
高级职称人数 int
)
GO
触发器
CREATE TRIGGER tri_zc ON 教师表
AFTER INSERT, UPDATE
AS
BEGIN
--记录插入的职称与所在部门号
DECLARE @zc varchar(10)
DECLARE @dept varchar(4)
SELECT @zc = 职称, @dept = 所在部门号
FROM inserted
UPDATE 部门表
SET 高级职称人数 = 高级职称人数 + 1
WHERE (@zc = '教授' OR @zc = '副教授') --此处应为完整格式
AND @dept= 部门号
END
GO
测试
插入初始值
问题1 语句结合优先级
第一次出现错误
经检查,问题在于逻辑语句的优先级
格式虽然表示职称或为教授或为副教授,但实际 AND 优先级高于 OR,即实际程序为:
UPDATE 部门表
SET 高级职称人数 = 高级职称人数 + 1
WHERE @zc = '教授' OR (@zc = '副教授'
AND 部门号 = @dept)
此逻辑表示只要职称为教授,将对每个部门的高级职称人数增加1个,显然错误。修正在 OR 语句两边加括号。问题解决:
问题2 不支持批量插入
网上查阅资料发现:
触发器不是每插入一行数据,就触发一下,而是,批量插入,只触发一次
此问题解决方式,待继续探索……
2020.2.19更新:已解决,参见下一篇文章:
数据库每日一题 (4)存储过程