Гость
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Trigger / 8 сообщений из 8, страница 1 из 1
07.12.2018, 13:46
    #39744265
tatarinov35
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Trigger
Написал триггер для проверки на удаление из таблицы
Код: 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
07.12.2018, 14:12
    #39744285
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Trigger
Ничего не надо делать. Так и должно быть. Удаляйте поштучно.

Еще можно упростить update в триггере.
...
Рейтинг: 0 / 0
07.12.2018, 14:15
    #39744291
tatarinov35
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Trigger
Задача состоит именно в удалении n-го кол-ва строк
...
Рейтинг: 0 / 0
07.12.2018, 14:23
    #39744298
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Trigger
tatarinov35Задача состоит именно в удалении n-го кол-ва строкделайте отдельными delete-ми.
Один delete не может быть выполнен частично. Он либо целиком выполнится, либо целиком нет.
По крайней мере, для InnoDB.
...
Рейтинг: 0 / 0
10.12.2018, 11:10
    #39745176
tatarinov35
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Trigger
А можно ли написать другой триггер или найти способ решить эту проблему? Вариант с временной корзиной, из которой восстанавливать после удаления не подходит.
...
Рейтинг: 0 / 0
10.12.2018, 12:29
    #39745240
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Trigger
А у Вас точно MySQL? веткой форума не ошиблись?
...
Рейтинг: 0 / 0
10.12.2018, 13:05
    #39745277
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Trigger
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
10.12.2018, 13:07
    #39745279
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Trigger
tatarinov35Задача состоит именно в удалении n-го кол-ва строк

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


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