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

Нравится

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

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

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

В 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)

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

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

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

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

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

select HOST_NAME()

а его ip:

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

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

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

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

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

Спасибо Олег!) а не подскажите где включить 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).

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

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