Avatar billede qqq Nybegynder
26. februar 2007 - 23:40 Der er 2 kommentarer og
1 løsning

Loop i T-SQL - Slette gamle brugere af website

Jeg vil lave et oprydnings-script som jeg kan køre direkte i Query Analyzer i SQL-Server 2000 for at rydde op i min database.

Men da jeg ikke ved meget om T-SQL, som jeg går udfra skal bruges til dette, spørger jeg Jer dygtige brugere af Eksperten.

Scriptet skal slette alle brugere af mit website, som ikke har brugt sitet i en bestemt tid. Alle brugere ligger i Users tabellen med tilhørende unikt ID (GUID).

Udover at slette brugerne fra Users tabellen (det er jo simpelt nok med almindelig SQL), så skal der for hver bruger også slettes alle records som vedrører denne bruger i en del andre tabeller.

Hvordan laver jeg dette i T-SQL? Som jeg ser det, skal der i T-SQL loopes igennem alle brugere og hvergang der findes en bruger der skal slettes, så skal alle denne brugers records i andre tabeller slettes med brugerens GUID fra Users tabellen som parameter. Selve brugeren i Users tabellen, slettes efterfølgende. Er det den korrekte måde at gøre det på? Kan I komme med eksempler, på hvordan jeg gør dette i praksis?

Da det er pænt mange tusinde brugere der skal slettes, må scriptet gerne tage højde for dette.

Jeg ser frem til at høre Jeres forslag.
Avatar billede arne_v Ekspert
27. februar 2007 - 01:01 #1
umiddelbart tror jeg at du skal lave noget lignende:

DELETE FROM tabelx WHERE brugerid NOT IN (SELECET brugerid FROM brugertabel WHERE notactive);
DELETE FROM tabely WHERE brugerid NOT IN (SELECET brugerid FROM brugertabel WHERE notactive);
DELETE FROM tabelz WHERE brugerid NOT IN (SELECET brugerid FROM brugertabel WHERE notactive);
DELETE FROM  brugertabel WHERE notactive;
Avatar billede moller2567 Nybegynder
01. marts 2007 - 18:15 #2
Umiddelbart, så tror jeg, at jeg ville lave en INSTEAD OF DELETE trigger på din brugertabel. Denne skal så slette de til brugeren hørende poster i andre tabeller først, og derefter slette den enkelte bruger. Så kan du fremover bare køre en sql-sætning: DELETE FROM brugere WHERE sidsteLogon < DATEADD(day, -180, GETDATE())
De -180 er f.eks for brugere, der ikke har være på i 180 dage

Din trigger kunne se nogenlunde således ud:

CREATE TRIGGER tr_brugertal ON [dbo].[brugertabelnavn]
INSTEAD OF DELETE
AS
DECLARE @brugerID INT

SELECT @brugerID = deleted.brugerid FROM deleted

IF (@brugerID > 0)
BEGIN
  DELETE FROM tabel1
  WHERE brugerid = @brugerID

  DELETE FROM tabel2
  WHERE brugerid = @brugerID
 
  osv..

  og til sidst slettes brugeren i brugertabellen

  DELETE FROM brugertabel
  WHERE brugerid = @brugerID
END

Opret triggeren, og så kan du i fremtiden bare slette brugerene i bryúgertabellen, så klarer triggeren resten.

Eve. ville det også kunne klares med fremmednøgler, og så ON DELETE CASCADE. Det gør lidt det samme.
Avatar billede froenie Nybegynder
08. marts 2007 - 16:13 #3
En anden løsning kunne være at lave en cursor...

eks.

Declare curs_del cursor local

for
select brugere som skal slettes

open curs_del

fetch next from Curs_daglig into variabel som skal holde id på rækker som skal slettes (Brugerid)

while @@Fetch_Status =0

Begin

Udfør deletes på de tabeller der skal slettes fra, ved brug af id'et
             

fetch next from Curs_daglig into variabel som skal holde id på rækker som skal slettes (Brugerid)
end


deallocate Curs_daglig
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