Avatar billede mickni33 Nybegynder
09. januar 2006 - 15:13 Der er 2 løsninger

SQL script ..add constraint

Jeg har lavet dette script her nedenunder  men er nu gået lidt død :-)

De steder hvor der står 'AnalyzerType' kunne jeg godt tænke mig var dynamisk sådan at algoritmen selv fandt sin parent og erstattede det med 'AnalyzerType'...

I øjeblikket skal jeg selv ind og finde alle parents i mit diagram og skrive det ind i koden og det er for besværligt.

Håber der er nogen der kan bygge videre på mit script her:-)

/////////////////////////////////////////////////////////////
DECLARE @temptable2 varchar (255)

DECLARE testCursorDropConstraint CURSOR LOCAL FOR
SELECT  sysobjects.name AS RelatedTable FROM sysobjects INNER JOIN  syscolumns ON sysobjects.id = syscolumns.id
INNER JOIN  sysforeignkeys ON syscolumns.id = sysforeignkeys.fkeyid AND  syscolumns.colid = sysforeignkeys.fkey
INNER JOIN  syscolumns syscolumns2 ON sysforeignkeys.rkeyid = syscolumns2.id AND  sysforeignkeys.rkey = syscolumns2.colid
INNER JOIN  sysobjects sysobjects2 ON syscolumns2.id = sysobjects2.id WHERE  sysobjects2.name = 'AnalyzerType'

OPEN testCursorDropConstraint
FETCH NEXT FROM testCursorDropConstraint INTO @temptable2 /* sætter @tabelname = med den første tabel som pointer peger på*/
WHILE @@FETCH_STATUS=0
        BEGIN   
        print @temptable2
EXEC('ALTER TABLE '+ @temptable2 +' DROP CONSTRAINT FK_'+ @temptable2 +'_AnalyzerType')
EXEC('ALTER TABLE '+ @temptable2 +' ADD  CONSTRAINT FK_'+ @temptable2 +'_AnalyzerType FOREIGN KEY (IDAnalyzerType) REFERENCES AnalyzerType (ID) ON DELETE CASCADE')
        FETCH NEXT FROM testCursorDropConstraint INTO @temptable2
        END
Close testCursorDropConstraint
DeAllocate testCursorDropConstraint
///////////////////////////////////////////////////////////////
Avatar billede mickni33 Nybegynder
11. januar 2006 - 15:54 #1
Hmmm fandt ud af at man ikke behøver at finde PArent for at sætte sin CONSTRAINT
:-)
Avatar billede mickni33 Nybegynder
11. januar 2006 - 15:55 #2
men koden kan afstattes med dette
OPEN cFKey
FETCH NEXT FROM cFKey INTO @cTab, @cCol, @cRefTab, @cRefCol, @cFKName
WHILE @@FETCH_STATUS = 0
    BEGIN
        /* recursion kalder sig selv for at finde sin Parent*/
        EXEC proc_findParentAndSetCascadeDelete @cRefTab
        print 'Parent til '+@cTab+ ' -> '+ @cRefTab /*cTab = child..... cRefTab = parent*/
        /* Når parent er fundet oprettes CONSTRAINT*/
        EXEC ('ALTER TABLE testDB_min.dbo.'+ @cTab +' DROP CONSTRAINT FK_'+ @cTab +'_'+@cRefTab)
        EXEC ('ALTER TABLE testDB_min.dbo.'+ @cTab +' ADD  CONSTRAINT FK_'+ @cTab +'_'+@cRefTab+' FOREIGN KEY (ID'+@cRefTab+') REFERENCES '+@cRefTab+' (ID) ON DELETE CASCADE')
        FETCH NEXT FROM cFKey INTO @cTab, @cCol, @cRefTab, @cRefCol, @cFKName       
    END
       
Close cFKey
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