Создание "корзины" для таблицы...

Модераторы: kdv, CyberMax

Ответить
Antoxa
Сообщения: 169
Зарегистрирован: 06 июл 2006, 10:53

Создание "корзины" для таблицы...

Сообщение Antoxa » 19 ноя 2009, 15:44

Подскажите, как можно реализовать такой механизм:

при удалении записи значения всех полей переносятся в таблицу клон (если таблицы нет, то создать ее)

например, есть таблица table1, при удалении любой записи, в таблицу table2 (имеющую такую же структуру, как table1) добавляется запись с данными удаляемой запаси из table1. Если таблицы table2 нет, то создать её, а уже после создания произвести "перенос" записи.

Видимо нужно сделать триггер на удаление, который будет запускать процедуру, в которой уже все это и будет прописано..?

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Re: Создание "корзины" для таблицы...

Сообщение WildSery » 19 ноя 2009, 17:41

Оставлять записи в таблице, не удалять, помечать "удалено".

Antoxa
Сообщения: 169
Зарегистрирован: 06 июл 2006, 10:53

Re: Создание "корзины" для таблицы...

Сообщение Antoxa » 20 ноя 2009, 05:39

WildSery писал(а):Оставлять записи в таблице, не удалять, помечать "удалено".
Это очень неудобно, во всех отчетах, выборках надо помнить об этой метке... Или есть какая-то стандартная процедура удаления (как в DBF) при которой удаленные запись не видно???

Или на такую таблицу сделать view в котором будет уже прописана выборка по метке (удалено=false)?

Как-то все это не надежно... Ведь обращение к информации в корзине ОООЧЕНЬ редко, возможно вообще никогда... Неужели нельзя сделать триггер+процедура..?

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Re: Создание "корзины" для таблицы...

Сообщение WildSery » 20 ноя 2009, 11:22

Antoxa писал(а):Это очень неудобно, во всех отчетах, выборках надо помнить об этой метке...
Не вижу тут ничего неудобного. Один AND в условии.
Antoxa писал(а):Или на такую таблицу сделать view в котором будет уже прописана выборка по метке (удалено=false)?
Вот как раз это может быть неудобным. Хотя, смотря что и как делать с таблицей. Для некоторых задач вполне себе решение.
Antoxa писал(а):Неужели нельзя сделать триггер+процедура..?
Можно, делай.
Учти только, что вот это как раз и будет неудобно. Тебе понадобятся либо дубли всех таблиц под твою "корзину", либо одна-две "универсальных", это тоже, если мягко выразиться, геморрой.

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Re: Создание "корзины" для таблицы...

Сообщение Dimitry Sibiryakov » 20 ноя 2009, 13:39

Antoxa писал(а):при удалении записи значения всех полей переносятся в таблицу клон (если таблицы нет, то создать ее)
Это в каком ПТУ дают такую лабораторную?

При нормальной разработке базы таблицу-клон создают одновременно с основной, так что "если таблицы нет, то создать её" - бред и ересь.

ЗЫ: Впрочем, это в любом случае ересь, поскольку написать триггер который вставляет записи в несуществующую таблицу можно только проктологически.

Antoxa
Сообщения: 169
Зарегистрирован: 06 июл 2006, 10:53

Re: Создание "корзины" для таблицы...

Сообщение Antoxa » 20 ноя 2009, 14:11

WildSery. and в каждом условии - это ТАК не нормально, что не может даже обсуждаться (только в случае невозможности другой реализации)

view - это действительно не вариант

Dimitry Sibiryakov » - это не в ПТУ - это в жизни, и то, что жизнь не всегда совпадает с общепринятыми способами реализации, так это только говорит о том, что надо менять общепринятые способы (и кем они вообще общеприняты)
При нормальной разработке базы таблицу-клон создают одновременно с основной, так что "если таблицы нет, то создать её" - бред и ересь.
Бред и ересь - это создавать таблицу заранее, не зная понадобится ли она вообще, когда-нибудь!!! Или я не прав???
Впрочем, это в любом случае ересь, поскольку написать триггер который вставляет записи в несуществующую таблицу можно только проктологически
.

??? Таблица должна создаться до вставки!!!

Если отстранено (без заинтересованности) проанализировать Ваши ответы, то получается, что мой вариант самый оптимальный и каких-либо конструктивных мнений опровергающих это пока не появилось.

Исходя из этого, отсутствие внятного совета может означать, в большей степени, сложность, или даже невозможность такой реализации для ответивших.

Поэтому прошу ответить знающих людей: как можно это реализовать, либо почему этого делать не надо. (Только без: "не надо, потому что так не делается"). Если это очень трудно сделать на уровне сервера, то это будет сделано на уровне программного кода и транзакций.

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Re: Создание "корзины" для таблицы...

Сообщение WildSery » 20 ноя 2009, 17:46

Antoxa писал(а):WildSery. and в каждом условии - это ТАК не нормально, что не может даже обсуждаться (только в случае невозможности другой реализации)
Только если у тебя вся работа с БД заключается в SELECT * FROM TABLE1.
Antoxa писал(а):Бред и ересь - это создавать таблицу заранее, не зная понадобится ли она вообще, когда-нибудь!!! Или я не прав???
Следуя такой логике, компонент "корзина" в виндусе тоже нужно сносить, когда она пуста, и заново инсталить, когда понадобится.
Antoxa писал(а):Если отстранено (без заинтересованности) проанализировать Ваши ответы, то получается, что мой вариант самый оптимальный и каких-либо конструктивных мнений опровергающих это пока не появилось.
Я тебе первым же ответом дал самый используемый и самый универсальный вариант.
Он же используется и не просто при удалении, а при журналировании всех изменений одной записи.
Dixi.

Antoxa
Сообщения: 169
Зарегистрирован: 06 июл 2006, 10:53

Re: Создание "корзины" для таблицы...

Сообщение Antoxa » 21 ноя 2009, 03:40

WildSery писал(а):Только если у тебя вся работа с БД заключается в SELECT * FROM TABLE1.
Дело не только в этом. Дело еще в том, что пользователь сам строит много запросов и придется автоматизировать процесс подстановки этого and ...
WildSery писал(а):Следуя такой логике, компонент "корзина" в виндусе тоже нужно сносить, когда она пуста, и заново инсталить, когда понадобится.
Не совсем так, windows хранит все в этом контейнере, а тут только конкретная таблица, но это не принципиально,можно и создать заранее, корзина нужна только для 1-3 таблиц, там где проводки денег (хотя хотелось бы автомат)
Antoxa писал(а):а при журналировании всех изменений одной записи
А как можно отслеживать изменения, если там будет установлен признак - удалено (smallint), либо снят этот признак (0,1), или тут что-то другое имелось ввиду?
Antoxa писал(а):Dixi
Имеется ввиду: в переводе с латинского "я всё сказал"?

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Re: Создание "корзины" для таблицы...

Сообщение Dimitry Sibiryakov » 21 ноя 2009, 14:02

Antoxa писал(а):Не совсем так, windows хранит все в этом контейнере, а тут только конкретная таблица, но это не принципиально,можно и создать заранее, корзина нужна только для 1-3 таблиц, там где проводки денег (хотя хотелось бы автомат)
А теперь ответь (хотя бы себе) на вопрос: когда и каким автоматом будет создаваться триггер, вставляющий в корзину удаляемые данные.

Antoxa
Сообщения: 169
Зарегистрирован: 06 июл 2006, 10:53

Re: Создание "корзины" для таблицы...

Сообщение Antoxa » 21 ноя 2009, 14:52

Antoxa писал(а):А теперь ответь (хотя бы себе) на вопрос: когда и каким автоматом будет создаваться триггер, вставляющий в корзину удаляемые данные.
Триггер будет создан вручную, в процессе создания БД. Таблица "клон" тоже и процедура по вставке записи тоже.

Т.е. триггер уже будет на удаление записей в таблице table1 и этот триггер должен запустить существующую процедуру с входящими параметрами ([имя таблицы], [id-значение первичного ключа]). Процедура должна обойти все поля table1 и вставить значения этих полей в одноименные поля табдицы "клона", например, del_table1. после этого происходит удаление записи из таблицы table1

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Re: Создание "корзины" для таблицы...

Сообщение Dimitry Sibiryakov » 22 ноя 2009, 13:23

Antoxa писал(а):Т.е. триггер уже будет на удаление записей в таблице table1 и этот триггер должен запустить существующую процедуру с входящими параметрами ([имя таблицы], [id-значение первичного ключа]). Процедура должна обойти все поля table1 и вставить значения этих полей в одноименные поля табдицы "клона", например, del_table1. после этого происходит удаление записи из таблицы table1
И весь этот ужас вместо простого

Код: Выделить всё

INSERT INTO table2 VALUES (:old.field1, :old.field2);
в триггере? Вот это и называется проктостоматологией.

Antoxa
Сообщения: 169
Зарегистрирован: 06 июл 2006, 10:53

Re: Создание "корзины" для таблицы...

Сообщение Antoxa » 22 ноя 2009, 15:27

Да, всё так, но хотелось это сделать на стороне сервера, а не из программы. И еще чтобы не отслеживать наличие полей. Т.е. например пользователь добавляет и/или удаляет поля из таблицы и всё работает, хотя и это все можно сделать в программе... Короче вопрос закрыт. Просто хотелось не в программе все это прописывать. И вообще побольше операций прописывать на стороне сервера

Ответить