題目
初答(有誤)
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)存儲過程