(изменено: sasha1983, 30 июля 2007г. 14:18:29)

Тема: Запрет удаления файлов из БД

Есть задача: сохранить в БД файлы после удаления их пользователем, т.е. создать аналог "корзины".
Можно переопределить ХП базы данных DelFileAttr: вместо удаления записи измененять её поле F_OBJID (оторвать от объекта). Это  сработает, когда пользователь удаляет конкретный файл с объекта. Как КОРРЕКТНО сделать, чтобы при удалении объекта "из системы" его файлы физически оставались в базе? (Используем TDMS2 и MS SQL 2000).

Re: Запрет удаления файлов из БД

Задача изначально поставленна неверно.
Файлы в TDMS - неотемлемая часть информационного объекта. Зачем их отвязывать от объекта?

А чем не устраивает встроенный механизм версионности?

Если хотите чтобы пользователь не удалял объекты из системы - пишите обработчик события на удаление объекта их системы и скриптом переводите объект в статус с запретом видимости.

И зачем править исходный код?

Re: Запрет удаления файлов из БД

sasha1983 пишет:

Есть задача: сохранить в БД файлы после удаления их пользователем, т.е. создать аналог "корзины".
Можно переопределить ХП базы данных DelFileAttr: вместо удаления записи измененять её поле F_OBJID (оторвать от объекта). Это  сработает, когда пользователь удаляет конкретный файл с объекта. Как КОРРЕКТНО сделать, чтобы при удалении объекта "из системы" его файлы физически оставались в базе? (Используем TDMS2 и MS SQL 2000).

Вопрос в том, что вы потом с ними (с файлами) собираетесь делать. Если просто хранить на всякий случай, заведите объект без прав доступа пользователей и сваливайте туда все удаленные файлы. Пусть этот объект лежит на рабочем столе администратора, а ваша переопределенная ХП туда доливает файлы. Когда удаляется объект целиком, копируйте файлы в обработчике события ObjectBeforeErase. Чтобы найти этот объект, дополните его каким-нибудь уникальным свойством, и используйте в запросе права администратора.

Re: Запрет удаления файлов из БД

Спасибо за ответы.

Mishaf пишет:

Задача изначально поставленна неверно.
Файлы в TDMS - неотемлемая часть информационного объекта. Зачем их отвязывать от объекта?

Когда над большой группой файлов коллективно работает большая группа разработчиков, то возникают вопросы - "Куда делся мой бесценный документ (файл) - вчера был, а сегодня только объект пустой остался!". Если при удалении объектов это можно сказать по журналам событий, то при удалении файлов следов ни где не остается. Надеемся, в будующем это исправят разработчики в TDMS3, так как для программистов понятие информационного объекта - это нормально, а реальных пользователей, в основном, интересуют их файлы.


McZag пишет:

Когда удаляется объект целиком, копируйте файлы в обработчике события ObjectBeforeErase

Наверное, так и поступим. Плохо только, что для каждого типа объекта прописывать скрипт отдельно надо, в т.ч. и везде при программном удалении объекта, в служебных (для админа) командах и т.д.

Re: Запрет удаления файлов из БД

sasha1983 пишет:

Спасибо за ответы.

Когда над большой группой файлов коллективно работает большая группа разработчиков, то возникают вопросы - "Куда делся мой бесценный документ (файл) - вчера был, а сегодня только объект пустой остался!". Если при удалении объектов это можно сказать по журналам событий, то при удалении файлов следов ни где не остается. Надеемся, в будующем это исправят разработчики в TDMS3, так как для программистов понятие информационного объекта - это нормально, а реальных пользователей, в основном, интересуют их файлы.
Наверное, так и поступим. Плохо только, что для каждого типа объекта прописывать скрипт отдельно надо, в т.ч. и везде при программном удалении объекта, в служебных (для админа) командах и т.д.

Непонятно, что же Вы хотите складывать в корзину: объекты или файлы ?

Если объекты - то мне добавить нечего
Если файлы, то IMHO:
1) для каждого вновь создавемого объекта создаётся "корзина"
2) обрабатывается событие CheckedIn(Obj) таким образом, чтобы новая версия "корзины" содержала загруженные файлы

P.S. Добавление/удаление файлов не является модификацией объекта (не вызываются события Object_BeforeModify и Object_Modified).

Re: Запрет удаления файлов из БД

SSV пишет:

Непонятно, что же Вы хотите складывать в корзину: объекты или файлы ?

Файлы! Объектами отлично можно управлять и средствами системы.

SSV пишет:

P.S. Добавление/удаление файлов не является модификацией объекта (не вызываются события Object_BeforeModify и Object_Modified).

  :( Из-за этого все и затеяли...

Re: Запрет удаления файлов из БД

sasha1983 пишет:

Файлы! Объектами отлично можно управлять и средствами системы.

Тогда Вам не подходит Object_BeforeErase.

А поскольку момент удаления файла никак отловить нельзя - остаётся работать в момент добавления файлов к объекту (см выше)

Re: Запрет удаления файлов из БД

Спасибо за ответы - решение найдено:
1. В базе меняем процедуру:
CREATE PROCEDURE DelFileAttr
    @FileId bigint
AS
             UPDATE      TFileAttr
             SET              TFileAttr.F_OBJID=0,
                                TFileAttr.F_MODIFYTIME = GETDATE()
             WHERE        F_FILEID=@FileId
GO
Теперь командой "удалить файл" мы его не удаляем, а привязываем к несуществующему объекты с индексом = 0.

2. Чтобы отследить удаление файлов при удалении объекта:

Sub Object_BeforeErase(Obj, Cancel)
for each file in Obj.files
     file.erase
  next
End Sub

Re: Запрет удаления файлов из БД

sasha1983 пишет:

Плохо только, что для каждого типа объекта прописывать скрипт отдельно надо, в т.ч. и везде при программном удалении объекта, в служебных (для админа) командах и т.д.

Могу посоветовать побыстрее перейти на TDMS 3.0

Re: Запрет удаления файлов из БД

sasha1983 пишет:

Спасибо за ответы - решение найдено:
1. В базе меняем процедуру:
CREATE PROCEDURE DelFileAttr
    @FileId bigint
AS
             UPDATE      TFileAttr
             SET              TFileAttr.F_OBJID=0,
                                TFileAttr.F_MODIFYTIME = GETDATE()
             WHERE        F_FILEID=@FileId
GO
Теперь командой "удалить файл" мы его не удаляем, а привязываем к несуществующему объекты с индексом = 0.

А вы уверены, что объекта "с индексом = 0" не существует ?
Как Вы будете различать файлы с одинаковыми именами удаленные из разных объектов ?

sasha1983 пишет:

2. Чтобы отследить удаление файлов при удалении объекта:

Sub Object_BeforeErase(Obj, Cancel)
for each file in Obj.files
     file.erase
  next
End Sub

А вот тут то и сработает DelFileAttr ?

IMHO файлы из базы никогда не удаляться

Re: Запрет удаления файлов из БД

McZag пишет:

Могу посоветовать побыстрее перейти на TDMS 3.0

Как только исправят признанные ошибки по обработки событий до и после модификации объекта, так и перейдем...
А что, в TDMS 3.0 можно прописать скрипт на удаление ЛЮБОГО объекта? Справки-то пока нету!

SSV пишет:

А вы уверены, что объекта "с индексом = 0" не существует ?

Да, уверен!
На самом деле, можно же указать и номер реально существующего объекта, чтоб в БД не залезать лишний раз, а смотреть прямо из системы.

SSV пишет:

Как Вы будете различать файлы с одинаковыми именами удаленные из разных объектов ?

Можно сохранять номер старого объекта, например, в F_LOCATION.
Восстановление-то файла - это на крайний случай, а не регулярно ...

Re: Запрет удаления файлов из БД

sasha1983 пишет:

Да, уверен!

Вам об этом сообщили разработчики ?

sasha1983 пишет:

На самом деле, можно же указать и номер реально существующего объекта, чтоб в БД не залезать лишний раз, а смотреть прямо из системы.

Это мне кажется более правдоподобным сценарием.

А если файлы находятся на файловом сервере, они(файлы) останутся или удалятся (останется только запись в БД) ?

Re: Запрет удаления файлов из БД

sasha1983 пишет:

А что, в TDMS 3.0 можно прописать скрипт на удаление ЛЮБОГО объекта?

Да. Можно прописать это событие в общесистемный скрипт. Тогда он будет отрабатывать на любом объекте.

Re: Запрет удаления файлов из БД

SSV пишет:

Вам об этом сообщили разработчики ?
А если файлы находятся на файловом сервере, они(файлы) останутся или удалятся (останется только запись в БД) ?

Сам проверил  -  нулевого нету. Но даже если появится такой объект, то будет приятный сюрприз его создателю...
А файл-сервер мы не используем, хотя планируем.

Re: Запрет удаления файлов из БД

sasha1983 пишет:

Сам проверил  -  нулевого нету. Но даже если появится такой объект, то будет приятный сюрприз его создателю...
А файл-сервер мы не используем, хотя планируем.

Предположим: в версии TDMS 3.0 запись в таблице TObject с F_OBJID = 0 соответствует объекту "Объекты" (либо любой другой "зарезервированный" объект) - тогда 1) все Ваши удаляемые файлы будут попадать в файловый состав "Объекты" и никогда оттуда не удалятся; 2) неизвестно как поведет себя TDMS, если обнаружит файлы у объекта "Объекты". А в случае с файл-сервером (насколько я понимаю) в БД Вы получите ссылки на файлы, которые удалены из файлового хранилища.

Re: Запрет удаления файлов из БД

SSV пишет:

Предположим: в версии TDMS 3.0 запись в таблице TObject с F_OBJID = 0 соответствует объекту "Объекты" (либо любой другой "зарезервированный" объект) - тогда 1) все Ваши удаляемые файлы будут попадать в файловый состав "Объекты" и никогда оттуда не удалятся; 2) неизвестно как поведет себя TDMS, если обнаружит файлы у объекта "Объекты".

1. Такого объекта нет ни в TDMS 2.0 ни TDMS 3.0! 2. Объект "Объекты" имеет F_OBJID = 1122 3. Ничего страшного, если файлы добавить в объект "Объекты" - не происходит. 4. Для просмотра/удаления таких ничейных файлов пишется мааленькая программка, например на Delphi, доступная только администратору.

Re: Запрет удаления файлов из БД

Удачи

(изменено: Mishaf, 3 октября 2007г. 09:42:37)

Re: Запрет удаления файлов из БД

Кстати в TDMS 3.0 уже появились долгожданные обработчики событий по работе с файлами:

File_BeforeAdd
File_Added
File_BeforeErase
File_Erased
File_BeforeCheckOut
File_CheckedOut
File_BeforeCheckIn
File_CheckedIn

Так что пора переходить на трешку.  :))