2015-05-07 5 views
0

Я пытаюсь использовать 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

+0

Какие значения допускают ограничения проверки? Вы пытаетесь вставить «Нет» - если ограничение проверки установлено, чтобы разрешить «да» и «нет», то это не позволит «Нет». –

+0

Можете ли вы опубликовать тестовый пример, который воспроизводит проблему? Вы говорите, что используете триггер, но в вашем примере ничего не отображается, когда используется триггер. Ограничение проверки не работает, но мы не знаем, как это ограничение определено. –

+0

@JustinCave Я только что изменил и включил ссылку на [код] (http://ideone.com/s2wFLw). Я думал, что включил его. Просто заметили, что если я удалю логику 'if/else' и использую' WHEN (: new.isTeamLead = 'No') ', я получил 2 строки' no'. Интересно. – sedeh

ответ

2

Почему бы не просто добавить уникальный индекс-функции? Далее следует ограничить столбец иметь только один руководитель группы для каждого проекта:

create unique index idx_team_isTeamLead_yes on 
    team(case when isTeamLead = 'yes' then project else NULL end); 

Это использует игнорирование строк Oracle, где все столбцы индекса являются NULL.

+0

Отлично! Я получаю «Ошибка SQL: ORA-00942: таблица или представление не существует» на измененном [code] (http://ideone.com/s2wFLw), но все вставлено отлично. Просто любопытно, если вы столкнулись с той же ошибкой. Благодарю. – sedeh

Смежные вопросы