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

Откуда: Левый берег
Сообщений: 392
Здравствуйте!
MS SQL SERVER 2008
Замысел таков осуществить логирование действий над таблицами базы данных, а именно чтобы в некой таблице «Лог» с полями

[Имя таблицы] [действие] [дата] [имя входа]

Соответственно отлаживалась информация об update, insert над какой таблицей и под каким именем входа
Можно ли обойтись без создания триггера для каждой "наблюдаемой" таблицы?

Спасибо ...
28 май 12, 15:31    [12626478]     Ответить | Цитировать Сообщить модератору
 Re: Логирование действий над таблицами  [new]
Shakill
Member

Откуда: мск
Сообщений: 1880
Алексаша,

Справочник по приложению SQL Server Profiler
28 май 12, 15:36    [12626532]     Ответить | Цитировать Сообщить модератору
 Re: Логирование действий над таблицами  [new]
Алексаша
Member

Откуда: Левый берег
Сообщений: 392
Мне к чему нужна такая лог-таблица, чтобы затем в триггере таблице-редактируемой прежде чем разрешить редактирование записи этой самой табл. посмотреть в лог-таблице когда и кем была создана запись и в зависимости от условий разрешить либо отклонить редактирование
28 май 12, 16:04    [12626783]     Ответить | Цитировать Сообщить модератору
 Re: Логирование действий над таблицами  [new]
Shakill
Member

Откуда: мск
Сообщений: 1880
Алексаша
Можно ли обойтись без создания триггера

Алексаша
чтобы затем в триггере таблице-редактируемой прежде чем разрешить редактирование записи

так будет триггер или нет?
28 май 12, 16:10    [12626854]     Ответить | Цитировать Сообщить модератору
 Re: Логирование действий над таблицами  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
А чем стандартная система прав не устраивает?
Вам построчно проверять? Тогда смотрите кто: Функции безопасности
SELECT User, Current_User, System_User, Original_Login(), Is_Member('dbo') -- ...
28 май 12, 16:11    [12626860]     Ответить | Цитировать Сообщить модератору
 Re: Логирование действий над таблицами  [new]
Алексаша
Member

Откуда: Левый берег
Сообщений: 392
Спасибо за ответы.
Поясню, что я хотел :)
Есть БД.
Есть необходимость логировать действия пользователей над некоторыми таблицами БД. (Было бы не плохо видеть, кто создал запись, кто и сколько раз редактировал запись)
Пример табл. «Лог»
Имя таблицыид записидействиедата действияимя входа
Table11insert2012-05-28Коля
Table11update2012-05-28Вася
Table11update2012-05-28Коля
Table21update2012-05-28Коля

Первое что мне пришло в голову это сделать триггеры на Table1 и Table2 и там на инсерт и апдейт заполнять табл. «Лог» Когда я говорил можно ли обойтись без триггеров, я имел в виду можно ли обеспечить наполнение таблицы Лог без использования триггеров на каждой таблице, логировать которую мне бы хотелось.

Ребята, как правильно организовать наполняемость табл. "Лог", учитывая то, что в последующем данные этой табл. нужны будут для анализа типа - может ли опред. пользователь редактировать запись если создал ее др. пользователь 2 дня назад? А может эти данные можно черпать из системных табл. :) т.е ниче изобретать не надо ?
28 май 12, 17:10    [12627301]     Ответить | Цитировать Сообщить модератору
 Re: Логирование действий над таблицами  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Настройте Систему отслеживания измененных данных (Change Data Capture, CDC)
28 май 12, 17:22    [12627376]     Ответить | Цитировать Сообщить модератору
 Re: Логирование действий над таблицами  [new]
vov@
Member

Откуда: Днепропетровск
Сообщений: 110
Даже если ты и решишь этот вопрос, тут же появится следующий...а что конкретно менял Вася, и можно ли менять Коле то, что не трогал Вася...
А потом появится "супер" Вася? за действием которого вообще лучше не следить :)
Триггер - это не так и страшно, главное сделать его одинаковым для всех таблиц...
Например вызов процедуры с передачей 2-х параметров - таблица и действие
А вот в процедуре читать системные таблицы и дальше фантазия не ограничена
28 май 12, 17:28    [12627422]     Ответить | Цитировать Сообщить модератору
 Re: Логирование действий над таблицами  [new]
Алексаша
Member

Откуда: Левый берег
Сообщений: 392
Mnior
Настройте Систему отслеживания измененных данных (Change Data Capture, CDC)

На счет CDC, прочитал др. топики и не увидел решения того, как сохранять данные о том кто вставил, обновил, удалил запись. Только если использовать триггер на табл. который будет перед вставкой обновлением вставлять имя пользователя. Комбинировать cdc и триггеры, по-видимому, нет смысла, да и тогда как быть с удалением.
Для логирования действий над табл., получается, лучший способ триггеры ?
2 дек 12, 01:03    [13563301]     Ответить | Цитировать Сообщить модератору
 Re: Логирование действий над таблицами  [new]
aleks2
Guest
Алексаша
Пример табл. «Лог»
Имя таблицыид записидействиедата действияимя входа
Table11insert2012-05-28Коля
Table11update2012-05-28Вася
Table11update2012-05-28Коля
Table21update2012-05-28Коля



Ишо адын чайнег.
Ну и толку от такого "лога"?
2 дек 12, 10:16    [13563783]     Ответить | Цитировать Сообщить модератору
 Re: Логирование действий над таблицами  [new]
kain111
Member

Откуда:
Сообщений: 226
по правильному не надо давать вообще пользователям права на работу с базой на прямую и организовать логирование средствами интерфейса работы с базой. Если уж допустили такой способ работы,то для
автор
Мне к чему нужна такая лог-таблица, чтобы затем в триггере таблице-редактируемой прежде чем разрешить редактирование записи этой самой табл. посмотреть в лог-таблице когда и кем была создана запись и в зависимости от условий разрешить либо отклонить редактирование

сами же написали что вам нужно, контроль редактирования тригер самое то.
3 дек 12, 09:52    [13566706]     Ответить | Цитировать Сообщить модератору
 Re: Логирование действий над таблицами  [new]
Алексаша
Member

Откуда: Левый берег
Сообщений: 392
Здравствуйте.

Логирование решил делать с помощью ХП с использованием XML как здесь , т.е. все поля изменяемой записи некоторой таблицы сохраняются в поле типа XML другой табл.
В изменяемой таблице есть поле типа VARCHAR содержащие различные символы в т.ч. пробелы, %, \, /.
Вопрос как сохранить эти символы в поле FieldValues типа XML т.е. чтоб потом можно было восстановить?

вот отрывок кода по указанной выше ссылке

    SELECT ''D'' as Op, * INTO #TempTableName FROM Deleted
    UNION ALL
    SELECT ''I'', * FROM Inserted

    INSERT INTO tb_secDataTrail
        (TableName, DateTimeStamp, HostName, UserName, Op, FieldValues)
        SELECT 'TableName1', getdate(), HOST_NAME(), SYSTEM_USER, Op, 
            (SELECT * FROM #TempTableName Rec WHERE Rec.ид = Main.ид AND Rec.Op = Main.Op FOR XML AUTO)
            FROM #TempTableName Main


Спасибо ....
5 дек 12, 23:56    [13584919]     Ответить | Цитировать Сообщить модератору
 Re: Логирование действий над таблицами  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 3151
Алексаша
все поля изменяемой записи некоторой таблицы сохраняются в поле типа XML другой табл.

А не проще ли для таблицы table1 создать историческую таблицу hist_table1 той же структуры плюс столбец do_type, в триггере на table1 повесить копирование исходной строки в историческую таблицу плюс в столбец do_type ставить 1, если операция была update, и 2, если операция была delete. У Вас вообще какой-либо уникальный id для каждой строки присутствует? Как Вы собираетесь откатывать изменения - ведь в этом смысл "другой таблицы"? А если уникальных сочетаний столбцов нет - как по строкам второй таблицы Вы поймете, какие именно строки первой таблицы изменяли пользователи? Не пытаетесь ли Вы "объять необъятное", работаю работу вместо предварительного обдумывания того, зачем вообще это все нужно?
6 дек 12, 00:05    [13584940]     Ответить | Цитировать Сообщить модератору
 Re: Логирование действий над таблицами  [new]
Алексаша
Member

Откуда: Левый берег
Сообщений: 392
Andy_OLAP
Алексаша
все поля изменяемой записи некоторой таблицы сохраняются в поле типа XML другой табл.

А не проще ли для таблицы table1 создать историческую таблицу hist_table1 той же структуры плюс столбец do_type, в триггере на table1 повесить копирование исходной строки в историческую таблицу плюс в столбец do_type ставить 1, если операция была update, и 2, если операция была delete. У Вас вообще какой-либо уникальный id для каждой строки присутствует? Как Вы собираетесь откатывать изменения - ведь в этом смысл "другой таблицы"? А если уникальных сочетаний столбцов нет - как по строкам второй таблицы Вы поймете, какие именно строки первой таблицы изменяли пользователи? Не пытаетесь ли Вы "объять необъятное", работаю работу вместо предварительного обдумывания того, зачем вообще это все нужно?

Уникальные поля есть
Rec.ид = Main.ид AND Rec.Op = Main.Op
. Логирование нужно для некоторого числа таблиц и решение показалось лаконичным и быстрым в плане решения. Интересует как сохранить вышесказанные символы.
6 дек 12, 10:46    [13586047]     Ответить | Цитировать Сообщить модератору
 Re: Логирование действий над таблицами  [new]
Алексаша
Member

Откуда: Левый берег
Сообщений: 392
Блин .... Тупанул я. Все работает и символы сохраняются. Просто в маем рабочем случае есть 2 похожих поля.
Вопрос снят.
6 дек 12, 11:00    [13586189]     Ответить | Цитировать Сообщить модератору
 Re: Логирование действий над таблицами  [new]
Алексаша
Member

Откуда: Левый берег
Сообщений: 392
Вопрос по XML. Решил не создавать новую тему, т.к. вопрос возник в ходе текущей темы. Значит есть таблица лога одно поле которой типа XML в котором сохраняются все поля изменяемой записи некоторой табл. Хочу из всех записей поля типа XML сделать табл.

declare @Table1 Table
	(
	FeldValue XML
	)

insert into @Table1 values ('<Rec DateTimeStamp="2012-12-10T09:56:04.820" HostName="PC" UserLogin="Вася" Op="3" Номер="123" Дата="2012-12-10T00:00:00" />')	
insert into @Table1 values ('<Rec DateTimeStamp="2012-12-10T09:56:04.820" HostName="PC" UserLogin="Вася" Op="3" Номер="123" Дата="2012-12-10T00:00:00" />')


в результате хочу получить выборку
DateTimeStamp HostName UserLogin Op Номер
2012-12-10T09:56:04.820 PC Вася 3 123
2012-12-10T09:56:04.820 PC Вася 3 123
10 дек 12, 12:30    [13605653]     Ответить | Цитировать Сообщить модератору
 Re: Логирование действий над таблицами  [new]
Glory
Member

Откуда:
Сообщений: 104760
Алексаша
Решил не создавать новую тему, т.к. вопрос возник в ходе текущей темы.

И все следующие вопросы в рамках своего проекта вы будете задавть в этой теме ?
10 дек 12, 12:31    [13605668]     Ответить | Цитировать Сообщить модератору
 Re: Логирование действий над таблицами  [new]
Алексаша
Member

Откуда: Левый берег
Сообщений: 392
Хорошо, понял как скажите создам новую.
10 дек 12, 12:32    [13605679]     Ответить | Цитировать Сообщить модератору
 Re: Логирование действий над таблицами  [new]
Glory
Member

Откуда:
Сообщений: 104760
Алексаша
Хорошо, понял как скажите создам новую.

Сначала поиском воспользуйтесь.
10 дек 12, 12:33    [13605684]     Ответить | Цитировать Сообщить модератору
 Re: Логирование действий над таблицами  [new]
Алексаша
Member

Откуда: Левый берег
Сообщений: 392
Статья о конкетированнии ?
10 дек 12, 12:38    [13605725]     Ответить | Цитировать Сообщить модератору
 Re: Логирование действий над таблицами  [new]
Glory
Member

Откуда:
Сообщений: 104760
Алексаша
Статья о конкетированнии ?

О стандартных документированных способах работы с xml
10 дек 12, 12:40    [13605754]     Ответить | Цитировать Сообщить модератору
 Re: Логирование действий над таблицами  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Алексаша
Хорошо, понял как скажите создам новую.


не надо!

кстати, не затрагивая саму задачу в вашем описании, ее нужность, полезность или вредность, рекомендую обратить внимание на Broker.
10 дек 12, 13:08    [13606020]     Ответить | Цитировать Сообщить модератору
 Re: Логирование действий над таблицами  [new]
Col
Member

Откуда: Торонто
Сообщений: 180
Алексаша,

Аудит натравите на нужные таблички, ну а логи аудита уже парсить джобом.
10 дек 12, 23:58    [13609961]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить