powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Ограничивающий триггер
10 сообщений из 10, страница 1 из 1
Ограничивающий триггер
    #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
Ограничивающий триггер
    #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
Ограничивающий триггер
    #39353042
dan.mukazhan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
oragraf,

А зачем удалять первоначальную таблицу ?
И... где там указано, что именно в департаменте не должно быть больше 6 сотрудников ?
...
Рейтинг: 0 / 0
Ограничивающий триггер
    #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
Ограничивающий триггер
    #39353046
dan.mukazhan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mRdUKE,

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

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

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

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

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

зы
мат вью

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

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


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