Я пытаюсь использовать trigger
(как предложено here от Bohemian), чтобы ограничить количество yes/no
, которое произойдет в моей таблице. Я хочу не более одного yes
в столбце isTeamLead
за уникальный элемент в столбце project
, но при необходимости может иметь как можно больше no
. Для no
мне кажется, что я могу использовать только обходное решение, где я могу иметь что-то вроде no1
, no2
, no3
и т. Д. Мой код успешно вставляет строки yes
, но выдает ошибки на строках no
.Ограничение значений столбца с помощью триггера
DROP TABLE team CASCADE CONSTRAINTS PURGE ;
create table team (
name varchar2(10) NOT NULL UNIQUE,
project varchar2(10),
isTeamLead char(10) check (isTeamLead IN ('No', 'Yes'))
);
create unique index only_one_yes_per_project on team(project, isTeamLead);
DROP SEQUENCE test1_seq;
create SEQUENCE test1_seq
START WITH 1
INCREMENT BY 1;
set define off;
set serveroutput on format wrapped;
CREATE OR REPLACE TRIGGER insert_yesno
BEFORE INSERT ON team
FOR EACH ROW
BEGIN
IF (:new.isTeamLead = 'No') THEN
DBMS_OUTPUT.put_line(:new.isTeamLead);
:new.isTeamLead := CONCAT('No', test1_seq.nextval);
DBMS_OUTPUT.put_line(:new.isTeamLead);
INSERT INTO team VALUES
(:new.name, :new.project, :new.isTeamLead);
END IF;
END insert_yesno;
/
insert into team values ('member1', 'project1', 'Yes');
insert into team values ('member2', 'project1', 'No');
insert into team values ('member3', 'project1', 'No');
insert into team values ('member4', 'project2', 'No');
insert into team values ('member5', 'project2', 'Yes');
insert into team values ('member6', 'project2', 'No');
select * from team;
Вот снимок отчета об ошибке:
Error starting at line : 244 in command -
insert into team values ('member6', 'project2', 'No')
Error report -
SQL Error: ORA-02290: check constraint (SEDEH.SYS_C0012563) violated
ORA-06512: at "SEDEH.INSERT_YESNO", line 6
ORA-04088: error during execution of trigger 'SEDEH.INSERT_YESNO'
02290. 00000 - "check constraint (%s.%s) violated"
*Cause: The values being inserted do not satisfy the named check
Пожалуйста, дайте мне знать, если какие-либо мысли. Благодарю.
Запуск Oracle Database 11g Enterprise Edition Release 11.2.0.1.0
Какие значения допускают ограничения проверки? Вы пытаетесь вставить «Нет» - если ограничение проверки установлено, чтобы разрешить «да» и «нет», то это не позволит «Нет». –
Можете ли вы опубликовать тестовый пример, который воспроизводит проблему? Вы говорите, что используете триггер, но в вашем примере ничего не отображается, когда используется триггер. Ограничение проверки не работает, но мы не знаем, как это ограничение определено. –
@JustinCave Я только что изменил и включил ссылку на [код] (http://ideone.com/s2wFLw). Я думал, что включил его. Просто заметили, что если я удалю логику 'if/else' и использую' WHEN (: new.isTeamLead = 'No') ', я получил 2 строки' no'. Интересно. – sedeh