powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Задачка
25 сообщений из 145, страница 1 из 6
Задачка
    #33318694
Lom-22
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите пожалуйста решить такую задачку:
Создать триггер базы данных, не позволяющий вводить в таблицу ААА
более трех однофамильцев, работающих в одном отделе. В случае попытки
вставить четвертого однофамильца в отдел должно выводиться на экран
соответсвующее сообщение.
В таблице уже существуют и заполгненны поля:
nom_sotr - номер сотрудника
nom_otd - номер отдела
name1 - фамилия
name2 - имя
name3 - отчество
city - город
zarpl - зарплата
заранее спасибо за ответ....
...
Рейтинг: 0 / 0
Задачка
    #33318697
Sxak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lom-22Помогите пожалуйста решить такую задачку:
Создать триггер базы данных, не позволяющий вводить в таблицу ААА
более трех однофамильцев, работающих в одном отделе. В случае попытки
вставить четвертого однофамильца в отдел должно выводиться на экран
соответсвующее сообщение.
В таблице уже существуют и заполгненны поля:
nom_sotr - номер сотрудника
nom_otd - номер отдела
name1 - фамилия
name2 - имя
name3 - отчество
city - город
zarpl - зарплата
заранее спасибо за ответ....Кажется такое можно сталать триггером after на весь statement ... но не уверен, не писал такого.. попробуй
...
Рейтинг: 0 / 0
Задачка
    #33318702
Sxak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lom-22Помогите пожалуйста решить такую задачку:
Такое точно у меня сработало... переделай под свою задачу:
create table ttttt (a number)
/
-- сбой на 3м значении (1,2 - можно а 3 уже нельзя)
create or replace
trigger trg_ttttt_3a_err
after insert or update on ttttt
begin
for r in (select a,count(*) from ttttt group by a having count(*)>2) loop
raise_application_error(-20001,'3j povtor '||to_char(r.a));
end loop;
end;
/
Теперь в таблицку tttt можно затолкать только 2 одинаковых значения но не 3.. Проверил работает
...
Рейтинг: 0 / 0
Задачка
    #33318711
Sxak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sxak Lom-22Помогите пожалуйста решить такую задачку:
Такое точно у меня сработало... переделай под свою задачу:
create table ttttt (a number)
Наврал - так нельзя:-(
Пусть 3 пользователя вводят одинаковое одновременно и пока не коммитят.. Триггер тогда не ругается (не видит сессии другию пользователей) Потом происходит коммит и триггер начинает ругаться даже на безобидное изменение...
...
Рейтинг: 0 / 0
Задачка
    #33318713
Sxak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SxakНаврал - так нельзя:-(
Пусть 3 пользователя вводят одинаковое одновременно и пока не коммитят.. Триггер тогда не ругается (не видит сессии другию пользователей) Потом происходит коммит и триггер начинает ругаться даже на безобидное изменение...
PS может быть так будет можно если ты создашь индекс по ключевым полям (в твоем случае - отдел и фамилия) тогда может быть при вставке произойдет блокировка нужных блоков етого индекса и вставка одновременно одниъх значений будет невозможна, но тут у меня в голове некоторая каша - произойдет ли реально нужная блокировка не знаю. Но даже если произойдет перед созданием триггера надо будет проверить есть ли уже неправильные записи...
...
Рейтинг: 0 / 0
Задачка
    #33318729
Sxak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lom-22Помогите пожалуйста решить такую задачку:
Ну и последнее раз уж все молчат про блокировку а делать все и проверять тут времени нет и если блокировка обломается то теоритически возможна еще след схема:
1.триггер before на все - сбрасывает пакетные переменные
2. триггер after for each row - добавляет в PL/SQL таблицу которая есть пакетная переменая (та которая сбрасыватеся триггеров бефоре) ключи
3. триггер after на все - провереят только по ключам в пак переменной - тогда по кр мере лишней ругани не будет если уже есть лишние записи
...
Рейтинг: 0 / 0
Задачка
    #33318751
Падонак
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
select count(*) into i from 
 ( select t.name1, count(*) from t
   group by t.name1, t.nom_otd
   having count(*) >  3 
  )

if i >  0  then
 -- есть больше 3-х однофамильцов
...
Рейтинг: 0 / 0
Задачка
    #33318758
Падонак
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можно и так
Код: plaintext
1.
2.
3.
select count(*) into i from 
(select g.name1, count(*) over (partition by g.name1, g.otdel) as cnt from g)
where cnt >  3 
...
Рейтинг: 0 / 0
Задачка
    #33318761
Sxak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Падонакможно и так
Не понял твоего поста? Куда ты ему предлагаешь запихнуть такой блок?
...
Рейтинг: 0 / 0
Задачка
    #33318764
Падонак
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В триггере each row можно поступить проще

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
create or replace trigger CheckNames before insert or update on t for each row
declare
  i integer;
begin
  select count(*) into i from t where t.name1 = :new.name1 and t.nom_otd = :new.nom_otd;
  if i >=  3  then
    raise_application_error(- 20101 , 'В отделе итак много однофамильцов (' || :new.name1 || ')');
  end if;
end;
...
Рейтинг: 0 / 0
Задачка
    #33318766
Падонак
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sxak Падонакможно и так
Не понял твоего поста? Куда ты ему предлагаешь запихнуть такой блок?
да хоть в табличный триггер
...
Рейтинг: 0 / 0
Задачка
    #33318768
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты все-таки сначала попробуй
Да и вставляй не по одной строке, а хотя бы по 2 ;-)
...
Рейтинг: 0 / 0
Задачка
    #33318773
Падонак
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав ЛюбомудровТы все-таки сначала попробуй
Да и вставляй не по одной строке, а хотя бы по 2 ;-)
это кому?
...
Рейтинг: 0 / 0
Задачка
    #33318777
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тебе
...
Рейтинг: 0 / 0
Задачка
    #33318779
Sxak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПадонакВ триггере each row можно поступить проще

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
create or replace trigger CheckNames before insert or update on t for each row
declare
  i integer;
begin
  select count(*) into i from t where t.name1 = :new.name1 and t.nom_otd = :new.nom_otd;
  if i >=  3  then
    raise_application_error(- 20101 , 'В отделе итак много однофамильцов (' || :new.name1 || ')');
  end if;
end;
Сразу видно не писал ты триггеров...
...
Рейтинг: 0 / 0
Задачка
    #33318787
Sxak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Падонак[quot Sxak]дурень,
ты со мной письками мерица решыл чтоли?
На себя посмотри. Интересно здесь модераторы есть?
...
Рейтинг: 0 / 0
Задачка
    #33318789
Падонак
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав ЛюбомудровТы все-таки сначала попробуй
Да и вставляй не по одной строке, а хотя бы по 2 ;-)

Код: plaintext
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.
34.
create table G
(
  X     INTEGER,
  NAME1 VARCHAR2( 15 ),
  OTDEL INTEGER
)

create or replace trigger CheckNames after insert on G
declare 
  i integer;
begin

  select count(*) into i from 
    (select g.name1, count(*) over (partition by g.name1, g.otdel) as cnt from g)
  where cnt >  3 ;

  if i >  0  then
    raise_application_error(- 20101 , 'В отделе итак много однофамильцов');
  end if;
end;

insert into g
(
select  1 , 'Сидоров',  1  from dual
union
select  2 , 'Сидоров',  1  from dual
union
select  3 , 'Сидоров',  1  from dual
union
select  4 , 'Сидоров',  1  from dual
)

=
ORA- 20101  'В отделе итак много однофамильцов'
...
Рейтинг: 0 / 0
Задачка
    #33318793
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На ходу подметки рвешь Падонак В триггере each row можно поступить проще

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
create or replace trigger CheckNames before insert or update on t for each row
declare
  i integer;
begin
  select count(*) into i from t where t.name1 = :new.name1 and t.nom_otd = :new.nom_otd;
  if i >= 3  then
    raise_application_error(- 20101 , 'В отделе итак много однофамильцов (' || :new.name1 || ')');
  end if;
end;
Падонак
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
create or replace trigger CheckNames after insert on G
declare 
  i integer;
begin

  select count(*) into i from 
    (select g.name1, count(*) over (partition by g.name1, g.otdel) as cnt from g)
  where cnt >  3 ;

  if i >  0  then
    raise_application_error(- 20101 , 'В отделе итак много однофамильцов');
  end if;
end;
...
Рейтинг: 0 / 0
Задачка
    #33318795
Sxak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПадонакНу-ну А теперь прежде чем дурнями кидаться посмотри то же самое да с тем триггером на каждую строчку который ты писал. Кстати такой же (тот который работетат а не тот что фор ич роу) который ты тут только что написал я тут до тебя запостил....
Не писал ты триггров ето видно
...
Рейтинг: 0 / 0
Задачка
    #33318797
Падонак
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав ЛюбомудровНа ходу подметки рвешь
Так ты предметно пиши, о чем говоришь,
я предложил два варианта
один (даже два первых) потабличный,
другой (третий) построчный

так ты о третьем писал или как?
...
Рейтинг: 0 / 0
Задачка
    #33318799
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sxak Падонак[quot Sxak]дурень,
ты со мной письками мерица решыл чтоли?
На себя посмотри. Интересно здесь модераторы есть?Вчера модератор вежливо сделал этой паскуде замечание. Так она и модератора облаяла. Чувствует свою безнаказанность, собака.

В этоим форуме модераторов почти не видно - А ЖАЛЬ
Такое паскудство надо пресекать на корню - отключением.
...
Рейтинг: 0 / 0
Задачка
    #33318801
Sxak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Падонак Вячеслав ЛюбомудровНа ходу подметки рвешь
Так ты предметно пиши, о чем говоришь,
я предложил два варианта
один (даже два первых) потабличный,
другой (третий) построчный

так ты о третьем писал или как?Он предметно и написал. И я написал. Попиши триггеры познакомишься с ошибкаим типа "... изменяется триггер ф-ция может не заметить етого...." забыл уже точный текст ошибки
...
Рейтинг: 0 / 0
Задачка
    #33318803
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А заодно побалуйся с табличным триггером в разных сессиях
...
Рейтинг: 0 / 0
Задачка
    #33318806
Падонак
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав ЛюбомудровТы все-таки сначала попробуй
Да и вставляй не по одной строке, а хотя бы по 2 ;-)

Да, с построчным я погорячился. Моя ошибка.
...
Рейтинг: 0 / 0
Задачка
    #33318807
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну чтож, с такими репликами этот топик скорее всего закроют и автору придется начинать новый

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


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