我想寫一個觸發器來檢測用戶名何時包含非法字符串(如淫穢)。Oracle觸發器不執行 - INSTR函數問題
我有兩個小表:播放器和IllegalWords,其中IllegalWords包含用戶名將被檢查的詞。
我使用Oracle版本11g R2在www.sqlfiddle.com上測試了代碼。
當用戶名與非法單詞相匹配時(包括字母外殼,即小型大寫字母/大寫字母不同的情況),觸發器起作用。但是,當非法單詞是用戶名的子字符串時,它會失敗。例如,它不能檢測到悲傷的小丑包含小丑。
我不明白爲什麼,因爲我使用了INSTR函數。
誰能幫我理解嗎?
謝謝
LC
CREATE TABLE Player (
PlayerID INT,
UserName CHAR(100),
IsLocked CHAR(1) DEFAULT 0
)/
CREATE TABLE IllegalWords
(
Word CHAR(100)
)/
INSERT INTO Player
VALUES (1, 'John Doe', 0)/
INSERT INTO Player
VALUES (2, 'Paris Hilton', 0)/
INSERT INTO Player
VALUES (3, 'Krusty', 0)/
INSERT INTO Player
VALUES (4, 'Pierrot', 0)/
INSERT INTO IllegalWords
VALUES ('clown')/
CREATE OR REPLACE TRIGGER CheckIllegalName
AFTER INSERT OR UPDATE OF UserName ON Player
BEGIN
FOR r1 in (SELECT UserName FROM Player)
LOOP
FOR r2 in (SELECT Word FROM IllegalWords)
LOOP
IF (INSTR(LOWER(r1.UserName), LOWER(r2.Word)) != 0) THEN
UPDATE Player SET IsLocked = 1 WHERE UserName = r1.UserName;
END IF;
END LOOP;
END LOOP;
END CheckIllegalName;
/
UPDATE Player
SET UserName = 'clown'
WHERE PlayerID = 1/
UPDATE Player
SET UserName = 'Clown'
WHERE PlayerID = 2/
UPDATE Player
SET UserName = 'sadclown'
WHERE PlayerID = 3/
UPDATE Player
SET UserName = 'clown_is_sad'
WHERE PlayerID = 4/
SELECT * FROM Player/
結果:
PLAYERID, USERNAME, ISLOCKED
1, clown, 1
2, Clown, 1
3, sadclown, 0
4, clown_is_sad, 0
看起來像一個sqlfiddle中的錯誤。您是否在實際的Oracle數據庫上試過這段代碼? – wvdz
我在實際的數據庫(版本9.2)上嘗試了相同的代碼,結果是一樣的。 – lcazarre