數據庫每日一題(3)觸發器

題目

在這裏插入圖片描述

初答(有誤)

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)存儲過程

源碼地址

GitHub倉庫

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章