26. februar 2007 - 23:40Der 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.
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;
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.
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
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.