17. februar 2004 - 10:26Der er
9 kommentarer og 2 løsninger
Database log?
Hej eksperter,
Jeg har brug for at kunne se hvilke tabeller, der bliver opdateret når jeg udfører en funktion i mit system.
Jeg har kigget på produktet Log Explorer fra lumigent.com, men må indrømme prisen er alt for høj.
Er der ikke en simpel måde hvor på jeg kan se hvilke tabeller der er ændret fra et tidspunkt til et andet - eller fra 1 backup til en anden kunne også være en mulighed.
Jeg har søgt på Google i mange timer, men kan ikke finde nogen hjælp... håber du kan ;o)
... vups - fik trykket Send for tidligt :-) En løsning kunne være fx at lægge en INSERT, UPDATE og DELETE trigger på hver tabel du er interesseret i. Triggeren logger så ændringerne i en "audit tabel".
Fordelen er, at du meget fint kan styre hvad operationer du er interesseret i på de enkelte tabeller. Ulempen er, at hver transaktion nu omfatter to dataændringer (log+data selv) og det *kan* sløve systemet en smule plus at pladsforbruget går op.
At lægge en black box trace (server side trace) på serveren som Slash foreslår er også en mulighed - min erfaring siger dog, at den trækker væsentligt flere tænder end en trigger løsning (lidt afhængigt af hvad du beder den om at få med, naturligvis).
Det eneste jeg har behov for at vide, er hvilke tabeller der er berørt at nogle handlinger jeg laver fra mit system. Jeg har ikke behov for at se hvilke informationer der bliver gemt i dem.
Et meget meget simpelt triggerbaseret audit/log-system kunne så være at du trak appplikations-navn, sql bruger etc fra master.dbo.sysprocesses og gemte i en logtabel med info om hvilke tabeller der blev berørt.
Du må lige passe nedenstående eksempel til efter dit eget behov (umiddelbart burde det køre):
Først en log tabel til registering:
create table dbo.[log] ( id int identity(1,1) not null primary key nonclustered, log_timestamp datetime not null default(getdate()), userlogin varchar(128), command varchar(256), application_name varchar(256), table_name varchar(256), action varchar(256) ) go
På hver tabel du er interesseret i at få info om, der laver du en trigger som denne
create trigger [mytable_logtrigger] on [mytable] for insert, update, delete as begin declare @action varchar(20), @tbl varchar(256), @i tinyint, @d tinyint -- register hvilken tabel vi kommer fra set @tbl='mytable' -- find ud af hvad type operation (kan måske gøres nemmere) if exists(select 1 from inserted) set @i=1 if exists(select 1 from deleted) set @d=1 if @i=1 and @d=1 set @action='UPDATE' else if @i=1 set @action='INSERT' else if @d=1 set @action='DELETE'
-- indsæt info i log tabel insert into dbo.log (userlogin, command, application_name, table_name, action) select loginame, cmd, program_name, @tbl, @action from master.dbo.sysprocesses where spid=@@spid
end go
og vi skal lige sikre at alle har ret til sysprocesses for at ovenstående funker
use master go grant select to public on dbo.sysprocesses
Ok, det er først nu at jeg ser, at du "kort" skal overvåge hvad der sker. Jeg troede du havde behov for at køre noget over længere tid / evt. permanent.
I så fald så skal du overveje at bruge SQL Profiler. Du sætter den op til at filtrere på den ønskede databases ID - funktionen DB_ID() kan give den, ellers kig i master.dbo.sysdatabases - og tilføj SQL statements til de ting der samler op.
Start tracen, udfør dine handlinger, stop tracen.
Nu kan du så bruge tid på at analysere hvad præcist der sker.
Enig slash... har også været der. Jeg har bare ikke vidst hvad jeg skulle søge efter. Så er det fedt vi har eksperten hvor man kan få lidt hjælp til at komme videre ;o)
Igen, tak for hjælpen!!!
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.