powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / After / Before delete triggers
7 сообщений из 7, страница 1 из 1
After / Before delete triggers
    #32545452
nk_x
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно ли прервать выполнение транзакции на удаление записи, во время выполнения триггера на удаление? (Например каким-нибудь хитрым Эксепшеном)
Как я это делал в оракуле...
Запись не нужно удалять, нужно лишь пометить удаленной.


В FB приходится изголяться вроде следующего:

CREATE TABLE T
(ID DECIMAL(18, 0) NOT NULL,
NAME VARCHAR(128),
DELETED TIMESTAMP,
PRIMARY KEY (ID));

SET TERM ^ ;
CREATE TRIGGER T_DEL FOR T
ACTIVE AFTER DELETE POSITION 0
AS
DECLARE VARIABLE n decimal(18,0);
DECLARE VARIABLE s varchar(128);
BEGIN
n = old.id;
s = old.name;
insert into t(id,name,deleted) values(:n,:s,current_timestamp);
END
^
COMMIT WORK ^
SET TERM ;^
...
Рейтинг: 0 / 0
After / Before delete triggers
    #32545758
Фотография VF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЗапись не нужно удалять, нужно лишь пометить удаленной
а зачем???
если сам пишешь клиента, то пусть в определённой ситуации делается update специального поли, типа запись удалена и т.д.
ЗЫ не репликацию делаешь случаем?
...
Рейтинг: 0 / 0
After / Before delete triggers
    #32545809
Фотография Zmeishe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не знаю как в FB, а в IB легко.

Код: plaintext
CREATE EXCEPTION MY_EXCEPTION 'Бла-бла-бла';

Код: plaintext
1.
2.
3.
4.
5.
CREATE TRIGGER TB_MYTABLE_AD FOR TB_OPLATA
ACTIVE BEFORE DELETE POSITION  0 
as
begin
   if(...) then exception my_exception;
end
...
Рейтинг: 0 / 0
After / Before delete triggers
    #32545822
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
B fb такая же фигня :-)
...
Рейтинг: 0 / 0
After / Before delete triggers
    #32547003
nik_x
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пишу не реприкации, система учета/мониторинга.
В таблице необходимо сделать псевдо-удаление, молча, и успешно.
Пользователь через представление/view видит только те записи, в которых поле deleted is null.

2:Zmeishe - так пробовал, если записей псевдо-удалили несколько, то ловим пучок сообщений. (а как сделать, чтобы молча, яко-бы удаление прошло успешно?)

Воодще-то задача достаточно тривиальная и часто используемая, например в бухгалтерских системах (не 1С). Записи можно только помечать удаленными, но нельзя удалять...
...
Рейтинг: 0 / 0
After / Before delete triggers
    #32547140
Фотография VF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так если клиент свой, то почему не сделать просто update на кнопку удаления, то есть обновляешь ключевое поле, а потом выводишь записи по условию, что мешает? и никаких эксепшенов не надо...
...
Рейтинг: 0 / 0
After / Before delete triggers
    #32547278
Фотография Zmeishe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Каков твой вопрос
nk_xМожно ли прервать выполнение транзакции на удаление записи, во время выполнения триггера на удаление? (Например каким-нибудь хитрым Эксепшеном)Таков мой ответ.
Код: plaintext
1.
2.
3.
4.
5.
CREATE TRIGGER TB_MYTABLE_AD FOR TB_MYTABLE
ACTIVE BEFORE DELETE POSITION  0 
as
begin
   if(...) then exception my_exception;
end
Если надо сохранить удаляемую запись, свали её в лог таблицу триггером AFTER
Код: plaintext
1.
2.
3.
4.
5.
CREATE TRIGGER TB_MYTABLE_AD FOR TB_MYTABLE
ACTIVE AFTER DELETE POSITION  0 
as
begin
  insert into my_log_table(...)
end
А всё вместе и пометить и выкинуть хитрый эксепшен — не выйдет.
Эксепшен на то и эксепшен чтобы прервать и после него ничего не выполнилось.
nk_xВоодще-то задача достаточно тривиальная и часто используемая, например в бухгалтерских системах (не 1С). Записи можно только помечать удаленными, но нельзя удалять...
Отними права на удаление у всех. Если для изменений используешь компонент IBUpdateSQL, то в свойство DeleteSQL пропиши
Код: plaintext
1.
2.
update my_table 
set state_flag = 'D' 
where ID = :OLD_ID
Или сделай то, что предложил VF
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / After / Before delete triggers
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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