Avatar billede hojgaard Nybegynder
17. februar 2004 - 10:26 Der 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)

Takker!
Avatar billede slash Nybegynder
17. februar 2004 - 10:28 #1
hvad med at bruge SQL profiler til en start ?
Avatar billede trer Nybegynder
17. februar 2004 - 10:33 #2
Hvad præcist mener du med "tabeller der er ændret" - er det data du er interesseret i, eller er du metadata - altså tabelstruktur ?

Hvis det er det første, så er det ikke et problem som sådan at gøre det.
Avatar billede trer Nybegynder
17. februar 2004 - 10:37 #3
... 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).
Avatar billede hojgaard Nybegynder
17. februar 2004 - 10:42 #4
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.
Avatar billede hojgaard Nybegynder
17. februar 2004 - 10:49 #5
Der er ligegyldigt med hastigheden da jeg kun kort skal overvåge hvad der sker i db. Det jeg har behov for et selvfølgelig den letteste løsning :-)
Avatar billede trer Nybegynder
17. februar 2004 - 10:57 #6
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
Avatar billede trer Nybegynder
17. februar 2004 - 11:00 #7
I øvrigt - hvis du har brug for en mere præcis SQL registeret end den i sysprocesses så er der kommet en interessant mulighed i SQL Server 2000 SP3:

I sysprocesses er tilføjet et "handle" - det kan, kombineret med funktionen fn_get_sql(handle) give selve den kørende SQL ud.
Avatar billede trer Nybegynder
17. februar 2004 - 11:02 #8
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.
Avatar billede hojgaard Nybegynder
17. februar 2004 - 11:08 #9
1000 tak for hjælpen begge 2!!!

Jeg vidste ikke hvilke muligheder der var med Profiler.
Jeg vil prøve at se om jeg kan sætte den op så jeg kan få vist de pårørte tabeller.

Nu tror jeg ihvertfald jeg er på rette vej igen :o)
Avatar billede slash Nybegynder
17. februar 2004 - 11:11 #10
Generelt er det også altid en god idé at læse lidt i SQL-server books online!!!! Og måske også http://www.sqlteam.com
Avatar billede hojgaard Nybegynder
17. februar 2004 - 11:16 #11
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!!!
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester