Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Ограничивающий триггер / 10 сообщений из 10, страница 1 из 1
23.11.2016, 19:17
    #39353011
dan.mukazhan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ограничивающий триггер
Всем доброго времени суток.
Прошу помогите с триггером. Условие: Создать триггер, в департаменте не может быть больше 6 сотрудников.
create or replace trigger Trigger123
after insert or update on employees
for each row
declare
kol number;
err exception;
begin
select count(employee_id)
into kol
from employees
where department_id=:new.department_id
group by department_id;
if inserting then
if kol > 6 then
raise err;
end if;
end if;
if updating then
if :new.department_id <> :old.department_id then
if kol > 6 then
raise err;
end if;
end if;
end if;
exception
when err then
RAISE_APPLICATION_ERROR(-20200, 'STOP');
end Trigger123; Но данный триггер вызывает мутацию
Решил исправить это таким образом:
create or replace trigger zpk
FOR INSERT OR UPDATE ON employees
compound trigger
kol number;
d_id number;
BEFORE statement is
begin
select count(employee_id)
into kol
from employees
where department_id=:new.department_id
group by department_id;
end before statement;
after each row is
begin
if inserting then
if kol > 6 then
RAISE_APPLICATION_ERROR(-20200, 'STOP');
end if;
end if;
if updating then
if :new.department_id <> :old.department_id then
if kol > 6 then
RAISE_APPLICATION_ERROR(-20200, 'STOP');
end if;
end if;
end if;
end after each row ;
end zpk;
Но выходит ошибка...
ПРОШУ ПОМОГИТЕ)
...
Рейтинг: 0 / 0
23.11.2016, 19:55
    #39353034
oragraf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ограничивающий триггер
dan.mukazhan,
Чисто как пища для курсача.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
drop table employees cascade constraints purge;

create table employees
(
   n   number
);

create or replace trigger trigger123
   after insert or update
   on employees
declare
   kol   number;
   err   exception;
begin
   select COUNT (*)
     into kol
     from DUAL
    where exists
             (  select n
                  from employees
              group by n
                having COUNT (*) > 6);

   if kol > 0
   then
      raise_application_error (-20200, 'STOP');
   end if;
end trigger123;
...
Рейтинг: 0 / 0
23.11.2016, 20:00
    #39353042
dan.mukazhan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ограничивающий триггер
oragraf,

А зачем удалять первоначальную таблицу ?
И... где там указано, что именно в департаменте не должно быть больше 6 сотрудников ?
...
Рейтинг: 0 / 0
23.11.2016, 20:02
    #39353045
mRdUKE
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ограничивающий триггер
oragrafЧисто как пища для курсача.Эт вряд ли (с).
Правильнее будет скорей всего отправить товарища в ссылки, типа «RTFM» или «студентам желающим помощи»..
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
create or replace trigger trigger123
 after
  insert or update
 on employees
referencing new as new old as old
 for each row
declare
    kol number;
    err exception; 
    pragma autonomous_transaction;
begin
    select count(*)
    into kol
    from employees
    where department_id = :new.department_id; 
    
    if inserting then 
        if kol >= 6 then 
            raise err; 
        end if;
    end if;

    if updating then 
        if :new.department_id <> :old.department_id then 
            if kol >= 6 then 
                raise err; 
            end if; 
        end if; 
    end if; 
    
    exception when err then
        RAISE_APPLICATION_ERROR(-20200, 'STOP');
end Trigger123;

...
Рейтинг: 0 / 0
23.11.2016, 20:08
    #39353046
dan.mukazhan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ограничивающий триггер
mRdUKE,

Да, блин, знаний не хватает)
СПАСИБО ОГРОМНОЕ !
Выручили)

А можно узнать, что означает : referencing new as new old as old
и: pragma autonomous_transaction ??????
...
Рейтинг: 0 / 0
23.11.2016, 20:09
    #39353047
oragraf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ограничивающий триггер
dan.mukazhan,

Дальше сам дерзай
...
Рейтинг: 0 / 0
23.11.2016, 20:14
    #39353050
dan.mukazhan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ограничивающий триггер
oragraf,

Будем стараться !)
Спасибо )
...
Рейтинг: 0 / 0
23.11.2016, 20:20
    #39353053
Параллель
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ограничивающий триггер
dan.mukazhan,

И не забудь, в табелицу оракля может одновременно писАть несколько сессий.
...
Рейтинг: 0 / 0
23.11.2016, 21:53
    #39353090
stax..
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ограничивающий триггер
dan.mukazhan,
для оракля задачка не простая
недавно на не больше трех была

зы
мат вью

....
stax
...
Рейтинг: 0 / 0
23.11.2016, 21:56
    #39353091
stax..
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ограничивающий триггер
mRdUKE,
задачка не простая

....
stax
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Ограничивающий триггер / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]