powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Триггеры в InterBase
15 сообщений из 15, страница 1 из 1
Триггеры в InterBase
    #39205432
sfire
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый вечер. Нужно создать простенький триггер : 1) сделать триггер который при изменении в таблице сотрудников
обновляет кол-во в таблице отделов.

Первая таблица (сотрудники)
авторCREATE TABLE SOTR
(Fio CHAR(40) NOT NULL,
Tabnom INTEGER NOT NULL PRIMARY KEY,
Nazvotd CHAR(20),
FOREIGN KEY (Nazvotd) REFERENCES OTDELY);
где nazvotd - название отделов

Вторая таблица (отделы).
авторCREATE TABLE OTDELY
(Nazvotd CHAR(20) NOT NULL PRIMARY KEY,
Kolsotr INTEGER);
где kolsotr - количество сотрудников.

Вот триггер, но не срабатывает почему-то.
авторSET TERM ^ ;
create trigger hello for sotr
active after update
as
begin
update otdely set kolsotr=kolsotr+1
where otdely.nazvotd=sotr.nazvotd ;
end
^
COMMIT WORK ^
SET TERM ;^


В чем проблема?
...
Рейтинг: 0 / 0
Триггеры в InterBase
    #39205435
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sfireВ чем проблема?
В том, что кто-то невнимательно читал Language Reference в части обращения к значениям
изменяемой записи в триггерах.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Триггеры в InterBase
    #39205441
sfire
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,
Можете подсказать как будет правильно? Сроки поджимают, сдавать нужно.
...
Рейтинг: 0 / 0
Триггеры в InterBase
    #39205443
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sfireМожете подсказать как будет правильно?
Могу. Но не хочу.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Триггеры в InterBase
    #39205450
sfire
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov, ну и на этом спасибо.

Кто поможет, буду благодарен.
...
Рейтинг: 0 / 0
Триггеры в InterBase
    #39205451
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sfire> create trigger hello for sotr
sfire> active after update
sfire> update otdely set kolsotr=kolsotr+1

Ты на апдейт сотрудников делаешь +1 в отделе.
Может, на инсерт надо? И на delete -1 соответственно.

sfire> where otdely.nazvotd=sotr.nazvotd ;

Не sotr.nazvotd а old.nazvotd или new.nazvotd.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Триггеры в InterBase
    #39205464
sfire
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам,

Большое Вам человеческое спасибо, все работает. И ведь глупые ошибки.
...
Рейтинг: 0 / 0
Триггеры в InterBase
    #39205496
sfire
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужна ещё помощь, по созданию одного триггера :
2) сделать триггер который проверяет не превышен ли лимит фонда зарплаты
по отделу( суммируя оклады сотрудников из таблицы сотрудников)

Имеется две таблицы :
авторCREATE TABLE SOTR
(Fio CHAR(40) NOT NULL,
Tabnom INTEGER NOT NULL PRIMARY KEY,
Nazvotd CHAR(20),
FOREIGN KEY (Nazvotd) REFERENCES OTDELY
Oklad INTEGER DEFAULT 600 CHECK(Oklad>=600)
);


oklad - оклад сотрудника.

авторCREATE TABLE OTDELY
(Nazvotd CHAR(20) NOT NULL PRIMARY KEY,
Kolsotr INTEGER,
Fondzarp INTEGER,
Limit INTEGER);


где fondzarp - фон з.п, limit - лимит отдела.

авторSET TERM ^ ;
create trigger hoho for sotr
after insert
as
begin
update otdely set fondzarp=fondzarp+new.oklad
where otdely.nazvotd=new.nazvotd and otdely.fondzarp < otdely.limit ;
end
^
COMMIT WORK ^
SET TERM ;^


При добавлении нового сотрудника в таблице sotr, поле Fondzarp в таблице отделы обновляется, но не выполняется условие otdely.fondzarp < otdely.limit , при добавлении зашел за лимит.

Как можно по другому реализовать?
Заранее спасибо!
...
Рейтинг: 0 / 0
Триггеры в InterBase
    #39205506
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sfire> При добавлении нового сотрудника в таблице sotr,
sfire> поле Fondzarp в таблице отделы обновляется, но не
sfire> выполняется условие otdely.fondzarp < otdely.limit ,
sfire> при добавлении зашел за лимит.

Я внимательно не вчитывался, но вроде всё правильно -
лимит превышен не был, условие выполнилось, фонд
увеличился и *после* этого лимит превысился.

А вот следующего превышения уже не будет.

> Как можно по другому реализовать?

Смотря что "это". В текущем варианте реализации
условие подправить несложно - что-то вроде
where ... and otdely.fondzarp + new.oklad <= otdely.limit ;

Но сама реализация у вас не очень, начиная со связей
таблиц по имени (суррогатных PK вообще нет?) и пр.
Я бы выше тройки не поставил.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Триггеры в InterBase
    #39205520
sfire
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам, Благодарю за ответ.

>А вот следующего превышения уже не будет. - Так оно и есть.
Спасибо за корректировку.
Таблицы мне были предоставлены и нужно просто написать триггеры.

Но сейчас подумав, понимаю, что мой триггер полная ерунда.

Предположим, есть отдел "AA" в таблице 'otdely', где фонд.зп = 2500 и лимит = 2500.
Мы добавляем сотрудника в таблице sotr в отдел 'AA', но ведь добавление не должно происходить, так как фон.зп не должен превышать лимит, в моем триггере добавление будет успешно.

Нужно как-то просуммировать оклад сотрудников, которые относятся к отделу 'AA' и сравнить с лимитом, если не превышает, то выполнять мой триггер. Только не знаю как написать в условии IF(....) THEN

Как-то можете подсказать как это реализовать?
Вы меня сегодня просто выручите :-)
...
Рейтинг: 0 / 0
Триггеры в InterBase
    #39205538
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sfire> Мы добавляем сотрудника в таблице sotr в отдел 'AA', но ведь
sfire> добавление не должно происходить, так как фон.зп не должен
sfire> превышать лимит, в моем триггере добавление будет успешно.

И это не единственная проблема.
Эту можно решить выбрасыванием
исключения в before-триггере.
Но опять же возможно проблемы
в многопользовательском режиме.

sfire> Нужно как-то просуммировать оклад сотрудников

Зачем его вновь суммировать, если он уже
просуммирован в "шапке" (в таблице отделов) ?

sfire> Только не знаю как написать в условии IF(....) THEN

Точно так же, как в Where.

> Как-то можете подсказать как это реализовать?

Повторюсь - у вас большая часть криво-косо-неправильно.
Для лаборатной (или что это там у вас) сойдёт, наверное,
но выше тройки я бы за такое не поставил.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Триггеры в InterBase
    #39205553
sfire
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам,
Все верно, это лабы. Попробую сдать так, если придерутся, тему подниму.

Ещё раз большое Вам человеческое спасибо за развернутые ответы и Ваше потраченное время.
...
Рейтинг: 0 / 0
Триггеры в InterBase
    #39205576
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sfireКак можно по другому реализовать?
это будет работать только в однопользовательском режиме. для подобного контроля нужен deferred constraint на столбец Fondzarp. А в InterBase и Firebird констрейнты только immediate, и deferred constraints не поддерживаются.
...
Рейтинг: 0 / 0
Триггеры в InterBase
    #39206492
Фищев Г. Ю.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sfire, Я бы придрался к подобной работе)
...
Рейтинг: 0 / 0
Триггеры в InterBase
    #39206505
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Фищев Г. Ю.> sfire, Я бы придрался к подобной работе)

Ааа, так это Ваш подопечный?
Так лучше учить надобно и
курсы лекций с методичками
более понятные составлять. :)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Триггеры в InterBase
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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