|
Триггеры в InterBase
|
|||
---|---|---|---|
#18+
Добрый вечер. Нужно создать простенький триггер : 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 ;^ В чем проблема? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.03.2016, 19:32 |
|
Триггеры в InterBase
|
|||
---|---|---|---|
#18+
sfireВ чем проблема? В том, что кто-то невнимательно читал Language Reference в части обращения к значениям изменяемой записи в триггерах. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
31.03.2016, 19:34 |
|
Триггеры в InterBase
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, Можете подсказать как будет правильно? Сроки поджимают, сдавать нужно. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.03.2016, 19:44 |
|
Триггеры в InterBase
|
|||
---|---|---|---|
#18+
sfireМожете подсказать как будет правильно? Могу. Но не хочу. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
31.03.2016, 19:46 |
|
Триггеры в InterBase
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, ну и на этом спасибо. Кто поможет, буду благодарен. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.03.2016, 19:51 |
|
Триггеры в InterBase
|
|||
---|---|---|---|
#18+
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 ... |
|||
:
Нравится:
Не нравится:
|
|||
31.03.2016, 19:54 |
|
Триггеры в InterBase
|
|||
---|---|---|---|
#18+
Гаджимурадов Рустам, Большое Вам человеческое спасибо, все работает. И ведь глупые ошибки. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.03.2016, 20:10 |
|
Триггеры в InterBase
|
|||
---|---|---|---|
#18+
Нужна ещё помощь, по созданию одного триггера : 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 , при добавлении зашел за лимит. Как можно по другому реализовать? Заранее спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
31.03.2016, 21:44 |
|
Триггеры в InterBase
|
|||
---|---|---|---|
#18+
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 ... |
|||
:
Нравится:
Не нравится:
|
|||
31.03.2016, 21:59 |
|
Триггеры в InterBase
|
|||
---|---|---|---|
#18+
Гаджимурадов Рустам, Благодарю за ответ. >А вот следующего превышения уже не будет. - Так оно и есть. Спасибо за корректировку. Таблицы мне были предоставлены и нужно просто написать триггеры. Но сейчас подумав, понимаю, что мой триггер полная ерунда. Предположим, есть отдел "AA" в таблице 'otdely', где фонд.зп = 2500 и лимит = 2500. Мы добавляем сотрудника в таблице sotr в отдел 'AA', но ведь добавление не должно происходить, так как фон.зп не должен превышать лимит, в моем триггере добавление будет успешно. Нужно как-то просуммировать оклад сотрудников, которые относятся к отделу 'AA' и сравнить с лимитом, если не превышает, то выполнять мой триггер. Только не знаю как написать в условии IF(....) THEN Как-то можете подсказать как это реализовать? Вы меня сегодня просто выручите :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
31.03.2016, 22:18 |
|
Триггеры в InterBase
|
|||
---|---|---|---|
#18+
sfire> Мы добавляем сотрудника в таблице sotr в отдел 'AA', но ведь sfire> добавление не должно происходить, так как фон.зп не должен sfire> превышать лимит, в моем триггере добавление будет успешно. И это не единственная проблема. Эту можно решить выбрасыванием исключения в before-триггере. Но опять же возможно проблемы в многопользовательском режиме. sfire> Нужно как-то просуммировать оклад сотрудников Зачем его вновь суммировать, если он уже просуммирован в "шапке" (в таблице отделов) ? sfire> Только не знаю как написать в условии IF(....) THEN Точно так же, как в Where. > Как-то можете подсказать как это реализовать? Повторюсь - у вас большая часть криво-косо-неправильно. Для лаборатной (или что это там у вас) сойдёт, наверное, но выше тройки я бы за такое не поставил. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
31.03.2016, 22:35 |
|
Триггеры в InterBase
|
|||
---|---|---|---|
#18+
Гаджимурадов Рустам, Все верно, это лабы. Попробую сдать так, если придерутся, тему подниму. Ещё раз большое Вам человеческое спасибо за развернутые ответы и Ваше потраченное время. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.03.2016, 22:52 |
|
Триггеры в InterBase
|
|||
---|---|---|---|
#18+
sfireКак можно по другому реализовать? это будет работать только в однопользовательском режиме. для подобного контроля нужен deferred constraint на столбец Fondzarp. А в InterBase и Firebird констрейнты только immediate, и deferred constraints не поддерживаются. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.04.2016, 00:14 |
|
Триггеры в InterBase
|
|||
---|---|---|---|
#18+
sfire, Я бы придрался к подобной работе) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.04.2016, 00:00 |
|
|
start [/forum/topic.php?fid=40&msg=39205450&tid=1562250]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
56ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
46ms |
get tp. blocked users: |
2ms |
others: | 293ms |
total: | 436ms |
0 / 0 |