powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Trigger
8 сообщений из 8, страница 1 из 1
Trigger
    #39744265
tatarinov35
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Написал триггер для проверки на удаление из таблицы
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
create or replace trigger Banks_delete
before delete on banks
for each row
declare
    c number;
begin
SELECT COUNT(*) INTO c FROM accounts WHERE bank_id=:old.bank_id and dayto>sysdate;
    IF(c<2) THEN
       update accounts Set bank_id=null where bank_id IN (SELECT bank_id FROM accounts WHERE bank_id=:OLD.bank_id);
    ELSE
        raise_application_error(-20000,'Банк '||:old.name||' имеет более 1 действующего контракта.');
    END IF;
end;



Триггер работает правильно, но есть одна проблема. При попытке удалить сразу две строки, где одна подходит под условие, а другая нет
Код: plsql
1.
delete from banks where bank_id=1 or bank_id=5



Он выдает мою ошибку, а вторую строку не удаляет. Что делать?
...
Рейтинг: 0 / 0
Trigger
    #39744285
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ничего не надо делать. Так и должно быть. Удаляйте поштучно.

Еще можно упростить update в триггере.
...
Рейтинг: 0 / 0
Trigger
    #39744291
tatarinov35
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Задача состоит именно в удалении n-го кол-ва строк
...
Рейтинг: 0 / 0
Trigger
    #39744298
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tatarinov35Задача состоит именно в удалении n-го кол-ва строкделайте отдельными delete-ми.
Один delete не может быть выполнен частично. Он либо целиком выполнится, либо целиком нет.
По крайней мере, для InnoDB.
...
Рейтинг: 0 / 0
Trigger
    #39745176
tatarinov35
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А можно ли написать другой триггер или найти способ решить эту проблему? Вариант с временной корзиной, из которой восстанавливать после удаления не подходит.
...
Рейтинг: 0 / 0
Trigger
    #39745240
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А у Вас точно MySQL? веткой форума не ошиблись?
...
Рейтинг: 0 / 0
Trigger
    #39745277
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tatarinov35Написал триггер для проверки на удаление из таблицы
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
create or replace trigger Banks_delete
before delete on banks
for each row
declare
    c number;
begin
SELECT COUNT(*) INTO c FROM accounts WHERE bank_id=:old.bank_id and dayto>sysdate;
    IF(c<2) THEN
       update accounts Set bank_id=null where bank_id IN (SELECT bank_id FROM accounts WHERE bank_id=:OLD.bank_id);
    ELSE
        raise_application_error(-20000,'Банк '||:old.name||' имеет более 1 действующего контракта.');
    END IF;
end;



Триггер работает правильно, но есть одна проблема. При попытке удалить сразу две строки, где одна подходит под условие, а другая нет
Код: plsql
1.
delete from banks where bank_id=1 or bank_id=5



Он выдает мою ошибку, а вторую строку не удаляет. Что делать?

Так ничего, так и должно быть...

Удаляй строки __по_одной__ -- будут удаляться.
...
Рейтинг: 0 / 0
Trigger
    #39745279
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tatarinov35Задача состоит именно в удалении n-го кол-ва строк

Тогда надо просто вычислить все строки, что подлежат удалению, и НЕ подходят под ограничение тригггера...
И их удалять.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Trigger
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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