|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
10.03.2013, 22:44 | #1 |
Форумчанин
Регистрация: 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] Проверил его работу - вроде как всё в порядке. Но так как я никогда триггеров раньше не писал, то "терзают смутные сомненья" - вдруг в нём какой-то баг которого я пока не замечаю. Никто не видит никаких потенциальных проблем в том триггере? |
10.03.2013, 23:02 | #2 |
Форумчанин
Регистрация: 11.03.2011
Сообщений: 426
|
Избыточное логирование ещё никогда пользы не приносило. Кто это всё будет анализировать и зачем это надо? Критически важные таблицы - это понятно, да и то проще добавить пару-тройку полей для аудита в саму таблицу.
|
10.03.2013, 23:24 | #3 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
Если еще его повесить на каждую таблицу достаточно серьёзнной базы, то приличная часть мощностей сервера уйдет на логирование. Не исключаю жутких тормозов при интенсивном обновлении данных. Это конечно проверить нужно, в любом случае согласен с ReportCube - информационной пользы будет не намного больше, чем при избирательном логировании
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
11.03.2013, 11:05 | #4 | ||||
Форумчанин
Регистрация: 09.02.2011
Сообщений: 150
|
Цитата:
Меня больше интересовало - не просмотрел ли я какой БАГ в том коде? Код взят не с "официального" сайта а просот с блога какого-то программиста. Цитата:
Цитата:
И информация в Логе моему Заказчику нужна как раз такая которую обеспечивает этот Пример. Так что с этой стороны у меня всё в порядке... Меня больше интересовало - не просмотрел ли я какой БАГ в том коде? Код взят не с "официального" сайта а просто с блога какого-то программиста. Цитата:
можно вынести в отдельную процедуру тот код который формирует переменную @SQL. То есть - почти всё начиная от "SELECT @UserName = system_user..." и до момента когда она полностью сформирована. А это - бОльшая и самая сложная часть кода. Вот уже выполнять выражение @SQL придётся в самом триггере - потому что только там доступны эти "таблицы" Inserted и Deleted. Правильно я рассуждаю? Последний раз редактировалось Stilet; 11.03.2013 в 13:37. |
||||
11.03.2013, 11:52 | #5 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
А что даст выделение части кода в процедуру? Только замедлит выполнение с учетом того, что EXEC в цикле выполняется. А в самом @SQL ссылок на Inserted и Deleted нет, обращение идет к временными таблицами #ins и #del
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
11.03.2013, 12:35 | #6 | |
Форумчанин
Регистрация: 09.02.2011
Сообщений: 150
|
Цитата:
"А в самом @SQL ссылок на Inserted и Deleted нет, обращение идет к временными таблицами #ins и #del" - да, но: эти таблицы имеют каждая свой тип. Потому - как я понимаю - нельзя написать процедуру которая бы их принимала как аршументы (если бы мы хотели в эту "универсуальную процедуру" затолкать вообще всё). Так? |
|
11.03.2013, 13:32 | #7 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
Как минимум до MS SQL 2005 включительно таблицу параметром типа Table в хранимку передать нельзя. Для более поздних версий нужно посмотреть. И для сведения - EXEC (@S) очень тормозная штучка
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
11.03.2013, 13:39 | #8 |
Форумчанин
Регистрация: 09.02.2011
Сообщений: 150
|
Да, в 2008 можно. НО: ведь если мы захотим написать универсальную процедуру, то как же мы сможем определить тип этих табличных параметров? Ведь в T-SQL нет параметра с типом "таблица вообще"; таблица должна быть определённого типа....
|
11.03.2013, 13:59 | #9 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
Да нет необходимости #ins и #del передавать как параметры. В хранимке вызванной из триггера, в котором эти таблицы созданы, они и так будут доступны по своим именам. Собственно автор для того их и создал, чтобы по именам использовать в EXEC (), что эквивалентно вызову хранимки, пусть и системной
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Последний раз редактировалось Аватар; 11.03.2013 в 14:01. |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
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 |