1

최근에 액세스 응용 프로그램을 SQL 서버에 저장하도록 변환했습니다. 양식은 여전히 ​​MS Access에 있지만 파일 DSN을 통해 SQL 서버에 연결됩니다.SQL Server 로깅/사용자 추적 기능

SQL 서버 내에서 사용자 활동을 추적하는 기능에 대한 질문이 생겼습니다.

SQL 서버에서 개별 사용자를 설정하고 사용자 컴퓨터에서 DSN을 설정할 때 이러한 개별 계정을 사용하면 SQL Server를 사용하여 사용자 활동을 추적 할 수 있다고 추측했습니다. 사실입니까?

현재 SQL Server 2005 표준이 있지만 비교적 빨리 2008로 업그레이드 할 예정입니다.

의견을 보내 주셔서 감사합니다.

+0

어떤 유형의 정보를 추적하고 싶습니까? 사물을 변화시킨 사람은 누구입니까? 또는 뷰 추적도 찾고 있습니까? –

+0

변경된 사람 –

답변

1

SQL 2008로 업그레이드 할 때 Change Data Capture이 있습니다.

+0

CDC는 데이터 변경 사항을 기록하지만 사용자 작업은 수행하지 않습니다. –

+0

수정안은 데이터 변경 내용 만 추적하려고한다고 가정했습니다. 모든 선택을 추적하는 것이 매우 유용하다고 상상할 수는 없지만 어떤 경우에는 그렇다고 생각합니다. – JoshBerke

0

사실인가요?

예, 변경 사항을 캡처하기위한 테이블의 트리거가 작동합니다. 또한 서버 측 추적을 설정하여 로그인 이벤트를 테이블에 기록 할 수 있습니다. 좀 더 구체적으로 대답하십시오.

1

현재 DDL 변경 사항을 추적하기 때문에 필요한 두 가지 기능과 테이블 구조가있는 DDL 트리거가 하나 있습니다. 코드를 실행하기 전에 데이터베이스에 "DbVersion"(예 : 2.3.4)의 ext props를 설정하고 (예를 들어, dev에, 테스트, 자극) "DbType과"당신의 선택과 함께 하나를 사용하여 [GA] 네임 스페이스를 교체하거나 하나 ... 편집 만들 ... 개체가 새의 경우는 null 버전과 고정 버그를

USE [GA_DEV] 
GO 

/****** Object: DdlTrigger [TraceDbChanges] Script Date: 05/07/2009 11:15:57 ******/ 
SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 


create trigger [TraceDbChanges] 
on database 
for create_procedure, alter_procedure, drop_procedure, 
create_table, alter_table, drop_table, 
create_function, alter_function, drop_function , 
create_trigger , alter_trigger , drop_trigger 
as 

set nocount on 

declare @data xml 
set @data = EVENTDATA() 
declare @DbVersion varchar(20) 
set @DbVersion =(select ga.GetDbVersion()) 
declare @DbType varchar(20) 
set @DbType =(select ga.GetDbType()) 
declare @DbName varchar(256) 
set @DbName [email protected]('(/EVENT_INSTANCE/DatabaseName)[1]', 'varchar(256)') 
declare @EventType varchar(256) 
set @EventType [email protected]('(/EVENT_INSTANCE/EventType)[1]', 'varchar(50)') 
declare @ObjectName varchar(256) 
set @ObjectName = @data.value('(/EVENT_INSTANCE/ObjectName)[1]', 'varchar(256)') 
declare @ObjectType varchar(25) 
set @ObjectType = @data.value('(/EVENT_INSTANCE/ObjectType)[1]', 'varchar(25)') 
declare @TSQLCommand varchar(max) 
set @TSQLCommand = @data.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'varchar(max)') 
declare @opentag varchar(4) 
set @opentag= '<' 
declare @closetag varchar(4) 
set @closetag= '>' 
declare @newDataTxt varchar(max) 
set @newDataTxt= cast(@data as varchar(max)) 
set @newDataTxt = REPLACE (REPLACE(@newDataTxt , @opentag , '<') , @closetag , '>') 
-- print @newDataTxt 
declare @newDataXml xml 
set @newDataXml = CONVERT (xml , @newDataTxt) 

declare @Version varchar(50) 
set @Version = @newDataXml.value('(/EVENT_INSTANCE/TSQLCommand/CommandText/Version)[1]', 'varchar(50)') 

-- if we are dropping take the version from the existing object 
if (SUBSTRING(@EventType , 0 , 5)) = 'DROP' 
set @Version =(select top 1 [Version] from ga.DbObjChangeLog where [email protected] order by [LogId] desc) 
if (@Version is null) 
set @Version = '1.0.0' 

declare @Description varchar(max) 
set @Description = @newDataXml.value('(/EVENT_INSTANCE/TSQLCommand/CommandText/Description)[1]', 'varchar(max)') 

declare @ChangeDescription varchar(max) 
set @ChangeDescription = @newDataXml.value('(/EVENT_INSTANCE/TSQLCommand/CommandText/ChangeDescription)[1]', 'varchar(max)') 

declare @LoginName varchar(256) 
set @LoginName = @data.value('(/EVENT_INSTANCE/LoginName)[1]', 'varchar(256)') 
declare @FirstName varchar(50) 
set @FirstName= (select [FirstName] from [ga].[LoginsForUsers] where [LoginName] = @LoginName) 
declare @LastName varchar(50) 
set @LastName = (select [LastName] from [ga].[LoginsForUsers] where [LoginName] = @LoginName) 
declare @SchemaName sysname 
set @SchemaName = @data.value('(/EVENT_INSTANCE/SchemaName)[1]', 'sysname'); 
--declare @Description xml 
--set @Description = @data.query('(/EVENT_INSTANCE/TSQLCommand/text())') 




print 'VERSION IS ' + @Version 
print @newDataTxt 
print cast(@data as varchar(max)) 


-- select column_name from information_schema.columns where table_name ='DbObjChangeLog' 
insert into [ga].[DbObjChangeLog] 
(
[DatabaseName] , 
[SchemaName], 
[DbVersion] , 
[DbType], 
[EventType], 
[ObjectName], 
[ObjectType] , 
[Version], 
[Description], 
[ChangeDescription], 
[SqlCommand] , 
[LoginName] , 
[FirstName], 
[LastName] 
) 

values(

@DbName, 
@SchemaName, 
@DbVersion, 
@DbType, 
@EventType, 
@ObjectName, 
@ObjectType , 
@Version, 
@Description, 
@ChangeDescription, 
@newDataTxt, 
@LoginName , 
@FirstName , 
@LastName 
) 


GO 

SET ANSI_NULLS OFF 
GO 

SET QUOTED_IDENTIFIER OFF 
GO 

DISABLE TRIGGER [TraceDbChanges] ON DATABASE 
GO 

ENABLE TRIGGER [TraceDbChanges] ON DATABASE 
GO