Установка и Администрирование
Разработка

Логирование изменений?

Добрый день. Есть задача в таблицу журнала изменений внести поле доменное имя и ip хоста с которого производились изменения. Я так понял данные вносятся триггерами на стороне сервера. Как можно реализовать данную задачу?

Нравится

10 комментариев

Насколько я понимаю, Вам нужно фиксировать эти данные только в таблице tbl_DatabaseLog? Тогда обратите внимание на хранимые процедуры tsp_CreateDeleteTrigger, tsp_CreateUpdateTrigger и tsp_TableTrigger. Во всех местах, где встречается "tbl_DatabaseLog" или "@DatabaseLogBegin", необходимо соответствующим образом отредактировать запросы (добавить Ваши колонки). Естественно, предварительно нужно добавить эти колонки в саму tbl_DatabaseLog. После этого перенастроить логирование во всех таблицах.

Олег я еще не разобрался как происходит логирование изменений. Мне нужно нужно чтобы при изменении таблиц которые логируются помимо той информации которая сейчас добавляется еще добавлялась доменное имя и ip. И если кто знает как получить эти данные на стороне MSSQL?

В SQL получить доменное имя можно так (см. источник):

[sql]
DECLARE @Domain varchar(100), @key varchar(100)

SET @key = 'SYSTEM\ControlSet001\Services\Tcpip\Parameters\'
EXEC master..xp_regread @rootkey='HKEY_LOCAL_MACHINE', @key=@key,@value_name='Domain',@value=@Domain OUTPUT
SELECT 'Domain Name:'+convert(varchar(100),@Domain)
[/sql]

ip - немного сложнее (найдено здесь):

[sql]
create Procedure sp_get_ip_address (@ip varchar(40) out)
as
begin
Declare @ipLine varchar(200)
Declare @pos int
set nocount on
set @ip = NULL
Create table #temp (ipLine varchar(200))
Insert #temp exec master..xp_cmdshell 'ipconfig'
select @ipLine = ipLine
from #temp
where upper (ipLine) like '%IP-%'
if (isnull (@ipLine,'***') != '***')
begin
set @pos = CharIndex (':',@ipLine,1);
set @ip = rtrim(ltrim(substring (@ipLine ,
@pos + 1 ,
len (@ipLine) - @pos)))
end
drop table #temp
set nocount off
end
go

declare @ip varchar(40)
exec sp_get_ip_address @ip out
print @ip
[/sql]

Обратите внимание на строчку where upper (ipLine) like '%IP-%'. Возможно, у Вас она будет отличаться (зависит от операционной системы). Например, в источнике она выглядит по-другому. Поэтому, возможно, Вам придётся соответствующим образом изменить хранимую процедуру.

Спасибо Олег но получается что доменное имя это сервера а мне нужно клиента для того чтобы знать с какого комп. происходило изменение. Это возможно реализовать?

Тогда имя клиента получаем так:

[sql]
select HOST_NAME()
[/sql]

а его ip:

[sql]
set nocount on
declare @ip varchar(255), @cmd varchar(100)
set @cmd = 'ping ' + HOST_NAME()
create table #temptb (grabfield varchar(255))
insert into #temptb exec master.dbo.xp_cmdshell @cmd
select @ip = substring(grabfield, charindex('[',grabfield)+1,
charindex(']',grabfield)-charindex('[',grabfield)-1) from #temptb where charindex('[', grabfield) <> 0
print @ip
drop table #temptb
set nocount off
[/sql]

Источник - здесь.

Спасибо!) Только я немного не правильно выразился. не с имя комп. а доменное имя пользователя комп.

Возможно, Вам подойдёт такое решение:

[sql]
SET nocount ON
declare @ip varchar(255), @cmd varchar(100), @domainname varchar(100)
SET @cmd = 'ping ' + HOST_NAME()
CREATE TABLE #temptbl (grabfield varchar(255))
INSERT INTO #temptbl exec master.dbo.xp_cmdshell @cmd
SELECT @ip = substring(grabfield, charindex('[',grabfield)+1,
charindex(']',grabfield)-charindex('[',grabfield)-1) FROM #temptbl WHERE charindex('[', grabfield) <> 0
print @ip
delete from #temptbl

SET @cmd = 'nslookup ' + @ip
INSERT INTO #temptbl exec master.dbo.xp_cmdshell @cmd
SELECT @domainname = ltrim(substring(grabfield, charindex(':',grabfield)+1,
len(grabfield)-charindex(':',grabfield))) FROM #temptbl WHERE charindex('Name:', grabfield) <> 0
print @domainname
DROP TABLE #temptbl
SET nocount off
[/sql]

Спасибо Олег!) а не подскажите где включить master.dbo.xp_cmdshell процедуру?

В MS SQL 2000 она всегда включена, кажется, а для MS SQL 2005 нашёл такую инструкцию (п. 35):

"Как разрешить в SQL Server 2005 использование xp_cmdshell
Для включения возможности работы некоторых хранимых процедур и функций доступа в SQL 2005 предусмотрено приложение SQL Server Surface Area Configuration. Его можно открыть с меню программ Microsoft SQL Server 2005 - Configuration Tools - SQL Server Surface Area Configuration. В появившемся окне надо выбрать "Surface Arrey Configuration for Feature", затем включить необходимое значение и нажать кнопку Применить (Apply)."

При включении этой процедуры обратите внимание на безопасность, поскольку: "иногда злоумышленники пытаются повысить свои полномочия с помощью хранимой процедуры xp_cmdshell" (цитата из MSDN).

Спасибо большое!) буду делать!)

Показать все комментарии