Супер-простой триггер перед вставкой (2 строки) не работает при вставке значений в таблицу - PullRequest
2 голосов
/ 01 июня 2019

Я создаю триггер, который вызывает ошибку приложения, если длина строки не равна 16.

CREATE OR REPLACE TRIGGER lunghezza_CF
before INSERT OR UPDATE ON Persona
FOR each ROW
BEGIN
    IF LENGTH(:NEW.CF) <> 16 THEN
        RAISE_APPLICATION_ERROR(-20002, 'CF length must be 16');
    END IF;
END;

Таблица Persona составлена ​​следующим образом:

CF char(16) primary key
...

Если я напишу следующее утверждение

insert into Persona(CF) values('ABC12')

По какой причине «ABC12» вставляется в таблицу?По какой-то причине мой триггер не работает должным образом, но, похоже, все в порядке ...

(обратите внимание, что LENGTH (строка) является встроенной функцией Oracle)

1 Ответ

5 голосов
/ 01 июня 2019

Проблема в том, что вы используете тип данных char, который заполнен пробелом до определенной длины и, следовательно, всегда точно такой же длины, как и его определение. Вы можете использовать trim() для удаления пробелов.

CREATE OR REPLACE TRIGGER lunghezza_CF
before INSERT OR UPDATE ON Persona
FOR each ROW
BEGIN
    IF LENGTH(TRIM(:NEW.CF)) <> 16 THEN
        RAISE_APPLICATION_ERROR(-20002, 'CF length must be 16');
    END IF;
END;

дб <> скрипка

Но вместо триггера вы можете просто использовать для этого проверочное ограничение.

ALTER TABLE persona
            ADD CHECK (length(trim(cf)) = 16);

дб <> скрипка

Обратите внимание, что trim() удаляет завершающие и ведущие пробелы. Если вы хотите считать начальные пробелы, вы можете использовать rtrim() вместо этого, что просто удаляет конечные пробелы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...