Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.03.2013, 22:44   #1
Glen
Форумчанин
 
Аватар для Glen
 
Регистрация: 09.02.2011
Сообщений: 150
По умолчанию MS SQL Server: универсальный Logger сделанный как триггер

MS SQL Server 2008

Вот на http://www.softcodearticle.com/2012/...in-sql-server/ нашёл пример - универсальный код триггера, позволяющий регистрировать операции INSERT, UPDATE и DELETE на любой таблиц. Этот триггер регистрирует их в таблице такого вот типа:

CREATE TABLE [dbo].[Audit](
[TYPE] [CHAR](1) NULL,
[TableName] [VARCHAR](128) NULL,
[PK] [VARCHAR](1000) NULL,
[FieldName] [VARCHAR](128) NULL,
[OldValue] [VARCHAR](1000) NULL,
[NewValue] [VARCHAR](1000) NULL,
[UpdateDate] [datetime] NULL,
[UserName] [VARCHAR](128) NULL
) ON [PRIMARY]

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

Никто не видит никаких потенциальных проблем в том триггере?
Glen вне форума Ответить с цитированием
Старый 10.03.2013, 23:02   #2
ReportCube
Форумчанин
 
Аватар для ReportCube
 
Регистрация: 11.03.2011
Сообщений: 426
По умолчанию

Избыточное логирование ещё никогда пользы не приносило. Кто это всё будет анализировать и зачем это надо? Критически важные таблицы - это понятно, да и то проще добавить пару-тройку полей для аудита в саму таблицу.
ReportCube вне форума Ответить с цитированием
Старый 10.03.2013, 23:24   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Если еще его повесить на каждую таблицу достаточно серьёзнной базы, то приличная часть мощностей сервера уйдет на логирование. Не исключаю жутких тормозов при интенсивном обновлении данных. Это конечно проверить нужно, в любом случае согласен с ReportCube - информационной пользы будет не намного больше, чем при избирательном логировании
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 11.03.2013, 11:05   #4
Glen
Форумчанин
 
Аватар для Glen
 
Регистрация: 09.02.2011
Сообщений: 150
По умолчанию

Цитата:
Сообщение от ReportCube Посмотреть сообщение
Избыточное логирование ещё никогда пользы не приносило. Кто это всё будет анализировать и зачем это надо? Критически важные таблицы - это понятно, да и то проще добавить пару-тройку полей для аудита в саму таблицу.
конкретно в МОЕЙ задаче Заказчик уже выделил несколько таблиц подлежащих Логированию. И информация в Логе ему нужна как раз такая которую обеспечивает этот Пример. Так что с этой стороны у меня всё в порядке...

Меня больше интересовало - не просмотрел ли я какой БАГ в том коде? Код взят не с "официального" сайта а просот с блога какого-то программиста.

Цитата:
Сообщение от Аватар Посмотреть сообщение
Если еще его повесить на каждую таблицу достаточно серьёзнной базы, то приличная часть мощностей сервера уйдет на логирование. Не исключаю жутких тормозов при интенсивном обновлении данных. Это конечно проверить нужно, в любом случае согласен с ReportCube - информационной пользы будет не намного больше, чем при избирательном логировании
Цитата:
Сообщение от ReportCube Посмотреть сообщение
Избыточное логирование ещё никогда пользы не приносило. Кто это всё будет анализировать и зачем это надо? Критически важные таблицы - это понятно, да и то проще добавить пару-тройку полей для аудита в саму таблицу.
конкретно в МОЕЙ задаче Заказчик уже выделил несколько таблиц подлежащих Логированию. На них и только на них я и повешу этот Триггер. То есть это не значит что раз он generic я его буду вешать на ВСЕ таблицы в моей базе :-)

И информация в Логе моему Заказчику нужна как раз такая которую обеспечивает этот Пример. Так что с этой стороны у меня всё в порядке...

Меня больше интересовало - не просмотрел ли я какой БАГ в том коде? Код взят не с "официального" сайта а просто с блога какого-то программиста.

Цитата:
Сообщение от ReportCube Посмотреть сообщение
Избыточное логирование ещё никогда пользы не приносило. Кто это всё будет анализировать и зачем это надо? Критически важные таблицы - это понятно, да и то проще добавить пару-тройку полей для аудита в саму таблицу.
Кстати, что касается "универсальности" этого кода:

можно вынести в отдельную процедуру тот код который формирует переменную @SQL. То есть - почти всё начиная от "SELECT @UserName = system_user..." и до момента когда она полностью сформирована. А это - бОльшая и самая сложная часть кода.

Вот уже выполнять выражение @SQL придётся в самом триггере - потому что только там доступны эти "таблицы" Inserted и Deleted. Правильно я рассуждаю?

Последний раз редактировалось Stilet; 11.03.2013 в 13:37.
Glen вне форума Ответить с цитированием
Старый 11.03.2013, 11:52   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А что даст выделение части кода в процедуру? Только замедлит выполнение с учетом того, что EXEC в цикле выполняется. А в самом @SQL ссылок на Inserted и Deleted нет, обращение идет к временными таблицами #ins и #del
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 11.03.2013, 12:35   #6
Glen
Форумчанин
 
Аватар для Glen
 
Регистрация: 09.02.2011
Сообщений: 150
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
А что даст выделение части кода в процедуру? Только замедлит выполнение с учетом того, что EXEC в цикле выполняется. А в самом @SQL ссылок на Inserted и Deleted нет, обращение идет к временными таблицами #ins и #del
>А что даст выделение части кода в процедуру? - это будет общая часть для ВСЕХ триггеров, которую не надо будет копировать в каждый триггер.

"А в самом @SQL ссылок на Inserted и Deleted нет, обращение идет к временными таблицами #ins и #del" - да, но: эти таблицы имеют каждая свой тип. Потому - как я понимаю - нельзя написать процедуру которая бы их принимала как аршументы (если бы мы хотели в эту "универсуальную процедуру" затолкать вообще всё). Так?
Glen вне форума Ответить с цитированием
Старый 11.03.2013, 13:32   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Как минимум до MS SQL 2005 включительно таблицу параметром типа Table в хранимку передать нельзя. Для более поздних версий нужно посмотреть. И для сведения - EXEC (@S) очень тормозная штучка
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 11.03.2013, 13:39   #8
Glen
Форумчанин
 
Аватар для Glen
 
Регистрация: 09.02.2011
Сообщений: 150
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Как минимум до MS SQL 2005 включительно таблицу параметром типа Table в хранимку передать нельзя. Для более поздних версий нужно посмотреть.
Да, в 2008 можно. НО: ведь если мы захотим написать универсальную процедуру, то как же мы сможем определить тип этих табличных параметров? Ведь в T-SQL нет параметра с типом "таблица вообще"; таблица должна быть определённого типа....
Glen вне форума Ответить с цитированием
Старый 11.03.2013, 13:59   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Да нет необходимости #ins и #del передавать как параметры. В хранимке вызванной из триггера, в котором эти таблицы созданы, они и так будут доступны по своим именам. Собственно автор для того их и создал, чтобы по именам использовать в EXEC (), что эквивалентно вызову хранимки, пусть и системной
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 11.03.2013 в 14:01.
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Sql. Триггер VAVILON17 Помощь студентам 4 10.01.2013 00:21
Триггер для БД на SQL Sayks Помощь студентам 1 20.04.2012 14:04
как работать в SQL Server Rusya-91 БД в Delphi 0 28.07.2011 11:52
отношения в бд sql server.как связать поля betirsolt БД в Delphi 15 21.05.2010 19:48