Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Задачка / 25 сообщений из 145, страница 1 из 6
12.10.2005, 06:50
    #33318694
Lom-22
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка
Помогите пожалуйста решить такую задачку:
Создать триггер базы данных, не позволяющий вводить в таблицу ААА
более трех однофамильцев, работающих в одном отделе. В случае попытки
вставить четвертого однофамильца в отдел должно выводиться на экран
соответсвующее сообщение.
В таблице уже существуют и заполгненны поля:
nom_sotr - номер сотрудника
nom_otd - номер отдела
name1 - фамилия
name2 - имя
name3 - отчество
city - город
zarpl - зарплата
заранее спасибо за ответ....
...
Рейтинг: 0 / 0
12.10.2005, 06:57
    #33318697
Sxak
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка
Lom-22Помогите пожалуйста решить такую задачку:
Создать триггер базы данных, не позволяющий вводить в таблицу ААА
более трех однофамильцев, работающих в одном отделе. В случае попытки
вставить четвертого однофамильца в отдел должно выводиться на экран
соответсвующее сообщение.
В таблице уже существуют и заполгненны поля:
nom_sotr - номер сотрудника
nom_otd - номер отдела
name1 - фамилия
name2 - имя
name3 - отчество
city - город
zarpl - зарплата
заранее спасибо за ответ....Кажется такое можно сталать триггером after на весь statement ... но не уверен, не писал такого.. попробуй
...
Рейтинг: 0 / 0
12.10.2005, 07:03
    #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
12.10.2005, 07:18
    #33318711
Sxak
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка
Sxak Lom-22Помогите пожалуйста решить такую задачку:
Такое точно у меня сработало... переделай под свою задачу:
create table ttttt (a number)
Наврал - так нельзя:-(
Пусть 3 пользователя вводят одинаковое одновременно и пока не коммитят.. Триггер тогда не ругается (не видит сессии другию пользователей) Потом происходит коммит и триггер начинает ругаться даже на безобидное изменение...
...
Рейтинг: 0 / 0
12.10.2005, 07:23
    #33318713
Sxak
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка
SxakНаврал - так нельзя:-(
Пусть 3 пользователя вводят одинаковое одновременно и пока не коммитят.. Триггер тогда не ругается (не видит сессии другию пользователей) Потом происходит коммит и триггер начинает ругаться даже на безобидное изменение...
PS может быть так будет можно если ты создашь индекс по ключевым полям (в твоем случае - отдел и фамилия) тогда может быть при вставке произойдет блокировка нужных блоков етого индекса и вставка одновременно одниъх значений будет невозможна, но тут у меня в голове некоторая каша - произойдет ли реально нужная блокировка не знаю. Но даже если произойдет перед созданием триггера надо будет проверить есть ли уже неправильные записи...
...
Рейтинг: 0 / 0
12.10.2005, 07:46
    #33318729
Sxak
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка
Lom-22Помогите пожалуйста решить такую задачку:
Ну и последнее раз уж все молчат про блокировку а делать все и проверять тут времени нет и если блокировка обломается то теоритически возможна еще след схема:
1.триггер before на все - сбрасывает пакетные переменные
2. триггер after for each row - добавляет в PL/SQL таблицу которая есть пакетная переменая (та которая сбрасыватеся триггеров бефоре) ключи
3. триггер after на все - провереят только по ключам в пак переменной - тогда по кр мере лишней ругани не будет если уже есть лишние записи
...
Рейтинг: 0 / 0
12.10.2005, 08:11
    #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
12.10.2005, 08:22
    #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
12.10.2005, 08:24
    #33318761
Sxak
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка
Падонакможно и так
Не понял твоего поста? Куда ты ему предлагаешь запихнуть такой блок?
...
Рейтинг: 0 / 0
12.10.2005, 08:26
    #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
12.10.2005, 08:26
    #33318766
Падонак
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка
Sxak Падонакможно и так
Не понял твоего поста? Куда ты ему предлагаешь запихнуть такой блок?
да хоть в табличный триггер
...
Рейтинг: 0 / 0
12.10.2005, 08:27
    #33318768
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка
Ты все-таки сначала попробуй
Да и вставляй не по одной строке, а хотя бы по 2 ;-)
...
Рейтинг: 0 / 0
12.10.2005, 08:30
    #33318773
Падонак
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка
Вячеслав ЛюбомудровТы все-таки сначала попробуй
Да и вставляй не по одной строке, а хотя бы по 2 ;-)
это кому?
...
Рейтинг: 0 / 0
12.10.2005, 08:31
    #33318777
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка
тебе
...
Рейтинг: 0 / 0
12.10.2005, 08:32
    #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
12.10.2005, 08:37
    #33318787
Sxak
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка
Падонак[quot Sxak]дурень,
ты со мной письками мерица решыл чтоли?
На себя посмотри. Интересно здесь модераторы есть?
...
Рейтинг: 0 / 0
12.10.2005, 08:38
    #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
12.10.2005, 08:40
    #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
12.10.2005, 08:40
    #33318795
Sxak
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка
ПадонакНу-ну А теперь прежде чем дурнями кидаться посмотри то же самое да с тем триггером на каждую строчку который ты писал. Кстати такой же (тот который работетат а не тот что фор ич роу) который ты тут только что написал я тут до тебя запостил....
Не писал ты триггров ето видно
...
Рейтинг: 0 / 0
12.10.2005, 08:42
    #33318797
Падонак
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка
Вячеслав ЛюбомудровНа ходу подметки рвешь
Так ты предметно пиши, о чем говоришь,
я предложил два варианта
один (даже два первых) потабличный,
другой (третий) построчный

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

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

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

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

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


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