Создание "корзины" для таблицы...
Создание "корзины" для таблицы...
Подскажите, как можно реализовать такой механизм:
при удалении записи значения всех полей переносятся в таблицу клон (если таблицы нет, то создать ее)
например, есть таблица table1, при удалении любой записи, в таблицу table2 (имеющую такую же структуру, как table1) добавляется запись с данными удаляемой запаси из table1. Если таблицы table2 нет, то создать её, а уже после создания произвести "перенос" записи.
Видимо нужно сделать триггер на удаление, который будет запускать процедуру, в которой уже все это и будет прописано..?
при удалении записи значения всех полей переносятся в таблицу клон (если таблицы нет, то создать ее)
например, есть таблица table1, при удалении любой записи, в таблицу table2 (имеющую такую же структуру, как table1) добавляется запись с данными удаляемой запаси из table1. Если таблицы table2 нет, то создать её, а уже после создания произвести "перенос" записи.
Видимо нужно сделать триггер на удаление, который будет запускать процедуру, в которой уже все это и будет прописано..?
Re: Создание "корзины" для таблицы...
Оставлять записи в таблице, не удалять, помечать "удалено".
Re: Создание "корзины" для таблицы...
Это очень неудобно, во всех отчетах, выборках надо помнить об этой метке... Или есть какая-то стандартная процедура удаления (как в DBF) при которой удаленные запись не видно???WildSery писал(а):Оставлять записи в таблице, не удалять, помечать "удалено".
Или на такую таблицу сделать view в котором будет уже прописана выборка по метке (удалено=false)?
Как-то все это не надежно... Ведь обращение к информации в корзине ОООЧЕНЬ редко, возможно вообще никогда... Неужели нельзя сделать триггер+процедура..?
Re: Создание "корзины" для таблицы...
Не вижу тут ничего неудобного. Один AND в условии.Antoxa писал(а):Это очень неудобно, во всех отчетах, выборках надо помнить об этой метке...
Вот как раз это может быть неудобным. Хотя, смотря что и как делать с таблицей. Для некоторых задач вполне себе решение.Antoxa писал(а):Или на такую таблицу сделать view в котором будет уже прописана выборка по метке (удалено=false)?
Можно, делай.Antoxa писал(а):Неужели нельзя сделать триггер+процедура..?
Учти только, что вот это как раз и будет неудобно. Тебе понадобятся либо дубли всех таблиц под твою "корзину", либо одна-две "универсальных", это тоже, если мягко выразиться, геморрой.
-
- Заслуженный разработчик
- Сообщения: 1436
- Зарегистрирован: 15 сен 2005, 09:05
Re: Создание "корзины" для таблицы...
Это в каком ПТУ дают такую лабораторную?Antoxa писал(а):при удалении записи значения всех полей переносятся в таблицу клон (если таблицы нет, то создать ее)
При нормальной разработке базы таблицу-клон создают одновременно с основной, так что "если таблицы нет, то создать её" - бред и ересь.
ЗЫ: Впрочем, это в любом случае ересь, поскольку написать триггер который вставляет записи в несуществующую таблицу можно только проктологически.
Re: Создание "корзины" для таблицы...
WildSery. and в каждом условии - это ТАК не нормально, что не может даже обсуждаться (только в случае невозможности другой реализации)
view - это действительно не вариант
Dimitry Sibiryakov » - это не в ПТУ - это в жизни, и то, что жизнь не всегда совпадает с общепринятыми способами реализации, так это только говорит о том, что надо менять общепринятые способы (и кем они вообще общеприняты)
??? Таблица должна создаться до вставки!!!
Если отстранено (без заинтересованности) проанализировать Ваши ответы, то получается, что мой вариант самый оптимальный и каких-либо конструктивных мнений опровергающих это пока не появилось.
Исходя из этого, отсутствие внятного совета может означать, в большей степени, сложность, или даже невозможность такой реализации для ответивших.
Поэтому прошу ответить знающих людей: как можно это реализовать, либо почему этого делать не надо. (Только без: "не надо, потому что так не делается"). Если это очень трудно сделать на уровне сервера, то это будет сделано на уровне программного кода и транзакций.
view - это действительно не вариант
Dimitry Sibiryakov » - это не в ПТУ - это в жизни, и то, что жизнь не всегда совпадает с общепринятыми способами реализации, так это только говорит о том, что надо менять общепринятые способы (и кем они вообще общеприняты)
Бред и ересь - это создавать таблицу заранее, не зная понадобится ли она вообще, когда-нибудь!!! Или я не прав???При нормальной разработке базы таблицу-клон создают одновременно с основной, так что "если таблицы нет, то создать её" - бред и ересь.
.Впрочем, это в любом случае ересь, поскольку написать триггер который вставляет записи в несуществующую таблицу можно только проктологически
??? Таблица должна создаться до вставки!!!
Если отстранено (без заинтересованности) проанализировать Ваши ответы, то получается, что мой вариант самый оптимальный и каких-либо конструктивных мнений опровергающих это пока не появилось.
Исходя из этого, отсутствие внятного совета может означать, в большей степени, сложность, или даже невозможность такой реализации для ответивших.
Поэтому прошу ответить знающих людей: как можно это реализовать, либо почему этого делать не надо. (Только без: "не надо, потому что так не делается"). Если это очень трудно сделать на уровне сервера, то это будет сделано на уровне программного кода и транзакций.
Re: Создание "корзины" для таблицы...
Только если у тебя вся работа с БД заключается в SELECT * FROM TABLE1.Antoxa писал(а):WildSery. and в каждом условии - это ТАК не нормально, что не может даже обсуждаться (только в случае невозможности другой реализации)
Следуя такой логике, компонент "корзина" в виндусе тоже нужно сносить, когда она пуста, и заново инсталить, когда понадобится.Antoxa писал(а):Бред и ересь - это создавать таблицу заранее, не зная понадобится ли она вообще, когда-нибудь!!! Или я не прав???
Я тебе первым же ответом дал самый используемый и самый универсальный вариант.Antoxa писал(а):Если отстранено (без заинтересованности) проанализировать Ваши ответы, то получается, что мой вариант самый оптимальный и каких-либо конструктивных мнений опровергающих это пока не появилось.
Он же используется и не просто при удалении, а при журналировании всех изменений одной записи.
Dixi.
Re: Создание "корзины" для таблицы...
Дело не только в этом. Дело еще в том, что пользователь сам строит много запросов и придется автоматизировать процесс подстановки этого and ...WildSery писал(а):Только если у тебя вся работа с БД заключается в SELECT * FROM TABLE1.
Не совсем так, windows хранит все в этом контейнере, а тут только конкретная таблица, но это не принципиально,можно и создать заранее, корзина нужна только для 1-3 таблиц, там где проводки денег (хотя хотелось бы автомат)WildSery писал(а):Следуя такой логике, компонент "корзина" в виндусе тоже нужно сносить, когда она пуста, и заново инсталить, когда понадобится.
А как можно отслеживать изменения, если там будет установлен признак - удалено (smallint), либо снят этот признак (0,1), или тут что-то другое имелось ввиду?Antoxa писал(а):а при журналировании всех изменений одной записи
Имеется ввиду: в переводе с латинского "я всё сказал"?Antoxa писал(а):Dixi
-
- Заслуженный разработчик
- Сообщения: 1436
- Зарегистрирован: 15 сен 2005, 09:05
Re: Создание "корзины" для таблицы...
А теперь ответь (хотя бы себе) на вопрос: когда и каким автоматом будет создаваться триггер, вставляющий в корзину удаляемые данные.Antoxa писал(а):Не совсем так, windows хранит все в этом контейнере, а тут только конкретная таблица, но это не принципиально,можно и создать заранее, корзина нужна только для 1-3 таблиц, там где проводки денег (хотя хотелось бы автомат)
Re: Создание "корзины" для таблицы...
Триггер будет создан вручную, в процессе создания БД. Таблица "клон" тоже и процедура по вставке записи тоже.Antoxa писал(а):А теперь ответь (хотя бы себе) на вопрос: когда и каким автоматом будет создаваться триггер, вставляющий в корзину удаляемые данные.
Т.е. триггер уже будет на удаление записей в таблице table1 и этот триггер должен запустить существующую процедуру с входящими параметрами ([имя таблицы], [id-значение первичного ключа]). Процедура должна обойти все поля table1 и вставить значения этих полей в одноименные поля табдицы "клона", например, del_table1. после этого происходит удаление записи из таблицы table1
-
- Заслуженный разработчик
- Сообщения: 1436
- Зарегистрирован: 15 сен 2005, 09:05
Re: Создание "корзины" для таблицы...
И весь этот ужас вместо простогоAntoxa писал(а):Т.е. триггер уже будет на удаление записей в таблице table1 и этот триггер должен запустить существующую процедуру с входящими параметрами ([имя таблицы], [id-значение первичного ключа]). Процедура должна обойти все поля table1 и вставить значения этих полей в одноименные поля табдицы "клона", например, del_table1. после этого происходит удаление записи из таблицы table1
Код: Выделить всё
INSERT INTO table2 VALUES (:old.field1, :old.field2);
Re: Создание "корзины" для таблицы...
Да, всё так, но хотелось это сделать на стороне сервера, а не из программы. И еще чтобы не отслеживать наличие полей. Т.е. например пользователь добавляет и/или удаляет поля из таблицы и всё работает, хотя и это все можно сделать в программе... Короче вопрос закрыт. Просто хотелось не в программе все это прописывать. И вообще побольше операций прописывать на стороне сервера