Добрый день. Есть задача в таблицу журнала изменений внести поле доменное имя и ip хоста с которого производились изменения. Я так понял данные вносятся триггерами на стороне сервера. Как можно реализовать данную задачу?
Нравится
Насколько я понимаю, Вам нужно фиксировать эти данные только в таблице 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).