Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Логирование через тригер? ОЧЕНЬ НАДО  [new]
nuk
Member

Откуда:
Сообщений: 3
Народ пожскажите? Есть различные таблицы в БД. И есть табличка SYS_LOG типа
date datetime, --дата и время действия
uid int, -- пользователь
object varchar(128), -- объект над которым проводится действие (имя таблицы)
[action] varchar(128), -- описание действия
beforestate text, -- состояние записи объекта до
afterstate text -- состояние записи объекта после

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

пробовал так:
FOR INSERT 
AS
declare @cSQL NVARCHAR(4000), @id varchar(8000)

set @cSQL='''[''+'

select @cSQL = @cSQL+'cast('+name+' as varchar)+''][''+' from syscolumns where id=(select id from sysobjects where name='lb_part_analiz') order by colid

set @cSQL = 'set @id = (select top 1'+Left(@cSQL,len(@cSQL)-3)+''' from inserted )'

execute sp_executesql @cSQL, N'@id varchar(8000) out', @id = @id out

insert into sys_log (hostprocessid,[host_name],object,[action],afterstate) 
	values(host_id(),host_name(),' [dbo].[LB_PART_ANALIZ] ','Insert new row', @id)

это пример для одной таблицы. Но беда в том что sp_executesql не видит объект тригера inserted. Подскажите возможно вообще такое реализовать?
25 окт 05, 10:03    [2001141]     Ответить | Цитировать Сообщить модератору
 Re: Логирование через тригер? ОЧЕНЬ НАДО  [new]
Prolog
Member

Откуда: Москва
Сообщений: 2791
А не лучше ли сделать для каждой таблицы свою аудит-таблицу. А триггер просто будет писать в нее таблицы inserted, deleted. А так у вас еще будут проблемы со столбцами типа text.
25 окт 05, 10:12    [2001185]     Ответить | Цитировать Сообщить модератору
 Re: Логирование через тригер? ОЧЕНЬ НАДО  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
nuk
... как туда запихнуть значение всех полей записи?
Надо сразу же вас разочаровать - виртуальная таблица inserted содержит ВСЕ строки, вставляемые в интструкции INSERT.
25 окт 05, 10:16    [2001205]     Ответить | Цитировать Сообщить модератору
 Re: Логирование через тригер? ОЧЕНЬ НАДО  [new]
nuk
Member

Откуда:
Сообщений: 3
дык как бы не хорошо это.... вы же видите , что в примере попытка на универсальность..... ведь кол-во таблиц в БД не лимитировано.... Ваше предложение это самый простой и ресурсоемкий выход..... ИМХО
25 окт 05, 10:19    [2001226]     Ответить | Цитировать Сообщить модератору
 Re: Логирование через тригер? ОЧЕНЬ НАДО  [new]
nuk
Member

Откуда:
Сообщений: 3
то TPG

нет. в данной системе я могу на 99,999999 гарантировать что там одна строка... да и тригер на инсерт как пример.... основные это update

ОТВЛЕЧЕННО: как отвечать определнному пользователю? Т.е. на определенное сообщение?
25 окт 05, 10:22    [2001241]     Ответить | Цитировать Сообщить модератору
 Re: Логирование через тригер? ОЧЕНЬ НАДО  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Журналирование изменений структуры БД и данных
25 окт 05, 10:24    [2001249]     Ответить | Цитировать Сообщить модератору
 Re: Логирование через тригер? ОЧЕНЬ НАДО  [new]
не важно
Guest
У меня есть такой универсальный триггер, вешается без каких-либо изменений на любую таблицу, стучите ICQ# 108006266
26 окт 05, 08:40    [2006003]     Ответить | Цитировать Сообщить модератору
 Re: Логирование через тригер? ОЧЕНЬ НАДО  [new]
BrokenPot
Member

Откуда: Киев
Сообщений: 1405
А поля типа text Ваш универсальный триггер тоже регистрирует?
26 окт 05, 09:22    [2006153]     Ответить | Цитировать Сообщить модератору
 Re: Логирование через тригер? ОЧЕНЬ НАДО  [new]
BrokenPot
Member

Откуда: Киев
Сообщений: 1405
А зачем триггер на инсерт? Скопировать ту запись, которая была только что вставлена, в еще одну таблицу?
26 окт 05, 09:24    [2006161]     Ответить | Цитировать Сообщить модератору
 Re: Логирование через тригер? ОЧЕНЬ НАДО  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31602
nuk
дык как бы не хорошо это.... вы же видите , что в примере попытка на универсальность..... ведь кол-во таблиц в БД не лимитировано.... Ваше предложение это самый простой и ресурсоемкий выход..... ИМХО

Предложение Prolog как раз самый нересурсоёмкий метод. Он везде и используется, с модификациями. А ваше решение в реальной системе работать не будет - слишком велика нагрузка.

nuk
то TPG

нет. в данной системе я могу на 99,999999 гарантировать что там одна строка... да и тригер на инсерт как пример.... основные это update

ОТВЛЕЧЕННО: как отвечать определнному пользователю? Т.е. на определенное сообщение?
А если не одной строки не вставится, вы ведь тоже вставляете запись в лог? Или вы тоже гарантируете? :-)

Если уж вы такие вещи гарантируете, то первой строкой в триггере ставьте проверку на количество изменяемых строк и откат транзакции. Иначе я считаю такой триггкр ошибочным.
26 окт 05, 09:54    [2006272]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить