Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как можно резервировать удаляемые записи в архивной БД?  [new]
Dmitry Oleynikov
Member

Откуда: Липецк, Россия
Сообщений: 14
Задача: сделать копирование удаляемых записей таблиц обной БД в таблици другой БД. Это связано с тем, что некий "крутой корпоративный" софт сделан так, что удаляет записи прямо из БД. После такого извращения не найдеш кто, что, когда и нафига что-то удалял.

Я так понял, что надо создать триггер AFTER DELETE и там указать действия. Но я еще совсем профан в этом, дайте примерчик?
На сколько я понял, триггеры обрабатывают события только для указанных таблиц - значить нельзя сделать один триггер на все таблицы, а надо делать свой триггер на каждую?
15 авг 11, 10:01    [11118166]     Ответить | Цитировать Сообщить модератору
 Re: Как можно резервировать удаляемые записи в архивной БД?  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5118
версия сервера у вас какая?
и как отнесётся этот "крутой корпоративный софт" к тому, что вы ему в БД триггера (или чего другое) наделаете?
15 авг 11, 10:14    [11118229]     Ответить | Цитировать Сообщить модератору
 Re: Как можно резервировать удаляемые записи в архивной БД?  [new]
Dmitry Oleynikov
Member

Откуда: Липецк, Россия
Сообщений: 14
Дедушка,

корпоративный софт - не знаю как отнесется, но есть тестовая система - буду проверять. Версия MSSQL 2005.
15 авг 11, 10:30    [11118307]     Ответить | Цитировать Сообщить модератору
 Re: Как можно резервировать удаляемые записи в архивной БД?  [new]
Aleksey-K
Member

Откуда: Москва
Сообщений: 3116
1.
Dmitry Oleynikov
...Это связано с тем, что некий "крутой корпоративный" софт сделан так, что удаляет записи прямо из БД. После такого извращения не найдеш кто, что, когда и нафига что-то удалял....

А что есть другой способ удаления записей, кроме как "прямо из БД"? Какой способ удаления записей вы называете не извращенным?
2. Учтите, что триггер не отловит удаление ВСЕХ записей через TRUNCATE TABLE.
С уважением, Алексей
15 авг 11, 10:42    [11118371]     Ответить | Цитировать Сообщить модератору
 Re: Как можно резервировать удаляемые записи в архивной БД?  [new]
Dmitry Oleynikov
Member

Откуда: Липецк, Россия
Сообщений: 14
Aleksey-K,

В нормальном софте есть признак удаленных записей, чтобы можно было восстановить последовательность работы с документом. На самом деле этот софт управляет большим складом. Ну там приемка, отгрузка итд. Она сопряжена через некий PI с основной расчетной системой. Иногда требуется удалить некий документ, чтобы , например , исправить его в основной системе и перевыгрузить. Но в случае, если будет утерян номер документа-связки (ну и такое бывает) - то невозможно найти, какой документ нужно перевыгрузить, так как в обеих системах нумерация своя, а номер-связка утеряна. Это только самый экстремальный редкий случай, но очень неприятный. Вот и появилась идея доусоверценствовать это чудо, чтобы хранились все удаленные записи.
Эту базу можно чистить время от времени - это уже частности.
15 авг 11, 10:51    [11118414]     Ответить | Цитировать Сообщить модератору
 Re: Как можно резервировать удаляемые записи в архивной БД?  [new]
Dmitry Oleynikov
Member

Откуда: Липецк, Россия
Сообщений: 14
Aleksey-K,

неизвращенный способ удаления документов в системе (извините, описался насчет удаления записей, требуется избежать безвозвратного удаления целых документов) - выставление флажка удаления документа с последующим переносом таких документов в архив.
15 авг 11, 10:55    [11118433]     Ответить | Цитировать Сообщить модератору
 Re: Как можно резервировать удаляемые записи в архивной БД?  [new]
Crimean
Member

Откуда:
Сообщений: 13147
крайний случай - использовать что-то типа CDC или настроить реплику и на подписчике уже сохранять что угодно и как угодно. "корпоративный софт" об этом ничего уже не узнает :)
15 авг 11, 11:21    [11118597]     Ответить | Цитировать Сообщить модератору
 Re: Как можно резервировать удаляемые записи в архивной БД?  [new]
Dmitry Oleynikov
Member

Откуда: Липецк, Россия
Сообщений: 14
Crimean,

Убейте, если я что-то понял (ну я совсем pre-alpha-beginner, получается) .
Я тут нашел в параллельном триде:
ALTER trigger [dbo].[Payments_del_upd_trg] on [dbo].[Payments]
after delete, update
as 
begin
	insert into AuditPayments
	select * from deleted
end
получается это навешано на таблицу [dbo].[Payments] так, что при удалении и обновлении, удаляемАЯ записЬ будет перенесена в таблицу AuditPayments ? А если записей несколько? надо какой-то цикл организовать? Меня устраивает , что для каждой оригинальной таблицы будет своя резервная таблица.

Кстати, а можно организовать вывод текстовой строки в файл? Возможно для моих нужд вполне сойдет писание текстового лога типа:
ДАТА, ЮЗЕР, ТАБЛИЦА, ИД-ДОКУМЕНТА, Некие значения через запятую
(прошу прощения за ламерские вопросы, просто тут у спецов спросить стесняюсь пока не наработаю какой-то опыт, а на форуме как-то безлично можно общаться. спасибо за понимание)
15 авг 11, 11:48    [11118825]     Ответить | Цитировать Сообщить модератору
 Re: Как можно резервировать удаляемые записи в архивной БД?  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
Dmitry Oleynikov
Crimean,

Убейте, если я что-то понял (ну я совсем pre-alpha-beginner, получается) .
Я тут нашел в параллельном триде:
ALTER trigger [dbo].[Payments_del_upd_trg] on [dbo].[Payments]
after delete, update
as 
begin
	insert into AuditPayments
	select * from deleted
end
получается это навешано на таблицу [dbo].[Payments] так, что при удалении и обновлении, удаляемАЯ записЬ будет перенесена в таблицу AuditPayments ? А если записей несколько? надо какой-то цикл организовать? Меня устраивает , что для каждой оригинальной таблицы будет своя резервная таблица.

Кстати, а можно организовать вывод текстовой строки в файл? Возможно для моих нужд вполне сойдет писание текстового лога типа:
ДАТА, ЮЗЕР, ТАБЛИЦА, ИД-ДОКУМЕНТА, Некие значения через запятую
(прошу прощения за ламерские вопросы, просто тут у спецов спросить стесняюсь пока не наработаю какой-то опыт, а на форуме как-то безлично можно общаться. спасибо за понимание)


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

из тригера в файл лучше не выводить, чревато...
если хочется в файл выводите джобом из логовых таблиц это более кашерно
15 авг 11, 12:02    [11118929]     Ответить | Цитировать Сообщить модератору
 Re: Как можно резервировать удаляемые записи в архивной БД?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Dmitry Oleynikov
получается это навешано на таблицу [dbo].[Payments] так, что при удалении и обновлении, удаляемАЯ записЬ будет перенесена в таблицу AuditPayments ? А если записей несколько? надо какой-то цикл организовать? Меня устраивает , что для каждой оригинальной таблицы будет своя резервная таблица.

deleted - это таблица. Там все записи, затронутые командой
Надо же хоть какую то документацию почитать
15 авг 11, 12:03    [11118936]     Ответить | Цитировать Сообщить модератору
 Re: Как можно резервировать удаляемые записи в архивной БД?  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5118
Dmitry Oleynikov,
create trigger
использование таблиц inserted и deleted
15 авг 11, 12:03    [11118942]     Ответить | Цитировать Сообщить модератору
 Re: Как можно резервировать удаляемые записи в архивной БД?  [new]
Dmitry Oleynikov
Member

Откуда: Липецк, Россия
Сообщений: 14
Glory,

Упс... Извиняюсь. Больше постараюсь не повторять таких ляпов.
Мы все учились понемногу, чему-нибудь и как-нибудь.
пошел учить матчасть - теперь есть что конкретно читать и разбирать.
Всем спасибо. если вопросы появятся, я еще спрошу.
15 авг 11, 12:08    [11118988]     Ответить | Цитировать Сообщить модератору
 Re: Как можно резервировать удаляемые записи в архивной БД?  [new]
Aleksey-K
Member

Откуда: Москва
Сообщений: 3116
Dmitry Oleynikov, а все-таки, вы уверены, что "крутой корпоративный" не будет использовать команду TRUNCATE TABLE?
Триггер на нее не сработает!
С уважением, Алексей
15 авг 11, 13:30    [11119704]     Ответить | Цитировать Сообщить модератору
 Re: Как можно резервировать удаляемые записи в архивной БД?  [new]
Dmitry Oleynikov
Member

Откуда: Липецк, Россия
Сообщений: 14
Aleksey-K,

Вроде этот софт не настолько крут. ПРоблемы возникают только при удалении.
CREATE TABLE [NEW_deletelog](
        [RecType] [nvarchar] (5) NULL,
        [deletedate] [datetime] NULL,
        [serialkey] [nvarchar](15) NULL,
        [dockey] [nvarchar](15) NULL,
        [externdockey] [nvarchar](15) NULL,
        [docdate] [datetime]  NULL)

create TRIGGER Orders_Delete_log
ON Orders
after DELETE, UPDATE
AS
SET NOCOUNT ON

INSERT INTO NEW_DeleteLog (RecType,deletedate,Serialkey, dockey, externdockey, docdate) 
SELECT 'Заказ',GETDATE(),serialkey, Orderkey, externorderkey, orderdate
FROM DELETED

RETURN

create TRIGGER Receipts_Delete_log
ON Receipt
after DELETE, UPDATE
AS
SET NOCOUNT ON

INSERT INTO NEW_DeleteLog (RecType,deletedate,Serialkey, dockey, externdockey, docdate) 
SELECT 'Прием',GETDATE(),serialkey, receiptkey, externreceiptkey, receiptdate
FROM DELETED

RETURN

Вот так сделал на тестовой - вроде пишет то, что надо. Только я не понял, к созданной таблице надо еще какие-то права давать юзерам или и так пойдет?
15 авг 11, 16:49    [11121600]     Ответить | Цитировать Сообщить модератору
 Re: Как можно резервировать удаляемые записи в архивной БД?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31962
Dmitry Oleynikov
Только я не понял, к созданной таблице надо еще какие-то права давать юзерам или и так пойдет?
Не надо
Dmitry Oleynikov
Вот так сделал на тестовой - вроде пишет то, что надо.
Обычно делают копии таблиц с дополнительными полями КТО и КОГДА, и пишут изменения в них. Так будет удобнее.

Ещё один вариант - сделать вьюху и INSTEAD OFF триггер, в котором заменить удаление из таблицы переводом флага.

Т.е. будет вьюха Orders и таблица TOrders
Приложение будет работать с Orders, а данные будут реально хранится в TOrders

Этот вариант конечно экстремальнее :-)
15 авг 11, 19:02    [11122661]     Ответить | Цитировать Сообщить модератору
 Re: Как можно резервировать удаляемые записи в архивной БД?  [new]
Dmitry Oleynikov
Member

Откуда: Липецк, Россия
Сообщений: 14
alexeyvg,

о, да! это экстремальный вариант, но мне он нравится. Только вот понравится ли корпоративному софту? неизвестно что его сервер приложений делает с этими таблицами. В данном контексте мне больше подходит использование триггеров.
16 авг 11, 09:12    [11124095]     Ответить | Цитировать Сообщить модератору
 Re: Как можно резервировать удаляемые записи в архивной БД?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31962
Dmitry Oleynikov
неизвестно что его сервер приложений делает с этими таблицами. В данном контексте мне больше подходит использование триггеров.
Да, согласен.

Просто упомянул для полноты картины.
16 авг 11, 09:19    [11124117]     Ответить | Цитировать Сообщить модератору
 Re: Как можно резервировать удаляемые записи в архивной БД?  [new]
Проходимец
Member

Откуда: Москва
Сообщений: 571
Dmitry Oleynikov
неизвестно что его сервер приложений делает с этими таблицами.

SQL-профайлер на тестовой системе при случае многое расскажет
16 авг 11, 09:38    [11124202]     Ответить | Цитировать Сообщить модератору
 Re: Как можно резервировать удаляемые записи в архивной БД?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31962
Проходимец
Dmitry Oleynikov
неизвестно что его сервер приложений делает с этими таблицами.

SQL-профайлер на тестовой системе при случае многое расскажет
Очень долго профилировать придётся :-)

Например, система может раз в год и при обновлении версии проверять базу на изменение модели. Как 1С
16 авг 11, 11:51    [11125194]     Ответить | Цитировать Сообщить модератору
 Re: Как можно резервировать удаляемые записи в архивной БД?  [new]
Dmitry Oleynikov
Member

Откуда: Липецк, Россия
Сообщений: 14
alexeyvg,

В том то и дело, что потроха системы закрытые, там врутри сервера приложений какая-то адская логика зашита. Но структуру на изменения проверять вроде не должон, судя по предыдущим опытам.
16 авг 11, 12:32    [11125594]     Ответить | Цитировать Сообщить модератору
 Re: Как можно резервировать удаляемые записи в архивной БД?  [new]
flexgen
Member

Откуда: Город на песке
Сообщений: 852
Dmitry Oleynikov
alexeyvg,

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


Любое изменение в аппликации созданной некой третьей стороной должно выполняться только этой самой третьей стороной иначе автоматически эта аппликация становится unsupported. Так что вместо того что бы вешать триггеры на таблицы свяжись с разработчиками и опиши им проблему и желаемое решение.
16 авг 11, 12:39    [11125656]     Ответить | Цитировать Сообщить модератору
 Re: Как можно резервировать удаляемые записи в архивной БД?  [new]
Dmitry Oleynikov
Member

Откуда: Липецк, Россия
Сообщений: 14
flexgen,

Вот я тоже об этом подумал - прежде чем решать поставить это на боевую систему , спрошу пермишен у внедрунов и поддержателей
16 авг 11, 12:59    [11125851]     Ответить | Цитировать Сообщить модератору
 Re: Как можно резервировать удаляемые записи в архивной БД?  [new]
LSV
Member [заблокирован]

Откуда: Киев
Сообщений: 30817
alexeyvg
Ещё один вариант - сделать вьюху и INSTEAD OFF триггер, в котором заменить удаление из таблицы переводом флага.
Т.е. будет вьюха Orders и таблица TOrders
Приложение будет работать с Orders, а данные будут реально хранится в TOrders
Этот вариант конечно экстремальнее :-)
Чревато. Например в 1С77 такой прикол у меня не прокатил. Она заметила подмену таблицы вьюхой. :)
16 авг 11, 13:07    [11125913]     Ответить | Цитировать Сообщить модератору
 Re: Как можно резервировать удаляемые записи в архивной БД?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31962
LSV
alexeyvg
Ещё один вариант - сделать вьюху и INSTEAD OFF триггер, в котором заменить удаление из таблицы переводом флага.
Т.е. будет вьюха Orders и таблица TOrders
Приложение будет работать с Orders, а данные будут реально хранится в TOrders
Этот вариант конечно экстремальнее :-)
Чревато. Например в 1С77 такой прикол у меня не прокатил. Она заметила подмену таблицы вьюхой. :)
Ага, про это как раз говорим...

Я поэтому и назвал вариант экстремальным :-)

Логирующие триггеры система тоже может сносить, но это не так страшно, их можно восстанавливать (даже автоматически).
16 авг 11, 13:25    [11126074]     Ответить | Цитировать Сообщить модератору
 Re: Как можно резервировать удаляемые записи в архивной БД?  [new]
Dmitry Oleynikov
Member

Откуда: Липецк, Россия
Сообщений: 14
alexeyvg,

не, наша не сносит! получено разрешение поддержки. Все ок. всем спасибо
16 авг 11, 16:46    [11127859]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить