Avatar billede hrc Mester
31. januar 2011 - 11:52 Der er 6 kommentarer og
1 løsning

INFORMATION_SCHEMES. Find tabeller/constraints som refererer til tabel

Overskriften siger egentlig det hele - og jeg kan ikke hitte ud af det. Jeg har en tabel og skal finde alle de tabeller (samt de foreign keys constraint der er)

Kan nogen hjælpe?
Avatar billede hrc Mester
31. januar 2011 - 12:14 #1
I opgaven har jeg en tabel (skabelon_menu) som en anden tabel (skabelon) refererer til via en fremmednøgle. For at kunne lave en generel løsning vil jeg gerne finde den refererende tabel udfra menu-tabellens navn. Altså en select med tabelnavnet som parameter.

Jeg synes ikke jeg kan trække det ud af INFORMATION_SCHEMAS-viewene.
Avatar billede HenrikSjang Nybegynder
31. januar 2011 - 12:32 #2
Prøv med:

select
    OBJECT_NAME(parent_object_id) as TableName,
    name as FKName,
    OBJECT_NAME(referenced_object_id) as ReferencedTableName,
    *
from sys.foreign_keys
Avatar billede hrc Mester
31. januar 2011 - 13:25 #3
Hej Sjang. Det ser ud til at virke, men er det den rette vej at undgå INFORMATION_SCHEMES og bruge den "gamle" tilgang i stedet. Er den ikke på vej ud?

select so1.NAME AS table_name
      ,so2.name AS referencing_table_name
      ,fk.name as constraint_name
from sys.foreign_keys fk
JOIN sys.sysobjects so1 ON (so1.id = fk.referenced_object_id)
JOIN sys.sysobjects so2 ON (so2.id = fk.parent_object_id)
WHERE (so1.name = @1)
  AND (so1.xtype = 'U')
  AND (fk.parent_object_id <> fk.referenced_object_id)
Avatar billede HenrikSjang Nybegynder
31. januar 2011 - 13:34 #4
Hey,

Ifølge http://msdn.microsoft.com/en-us/library/ms189807.aspx er sys.foreign_keys ikke deprecated. Men sys.sysforeignkeys ER: http://msdn.microsoft.com/en-us/library/ms177604.aspx

Så brug du kun lystigt sys.foreign_keys :)
Avatar billede HenrikSjang Nybegynder
31. januar 2011 - 13:35 #5
Det samme med sys.sysobjects som du har i dit eksempel. Den er også deprecated, men sys.objects er ikke.
Avatar billede hrc Mester
31. januar 2011 - 13:39 #6
Dvs.

select so1.NAME AS table_name
      ,so2.name AS referencing_table_name
      ,fk.name as constraint_name
from sys.foreign_keys fk
JOIN sys.objects so1 ON (so1.object_id = fk.referenced_object_id)
JOIN sys.objects so2 ON (so2.object_id = fk.parent_object_id)
WHERE (so1.name = @p1)
  AND (fk.parent_object_id <> fk.referenced_object_id)

Med tak læg et svar
Avatar billede HenrikSjang Nybegynder
31. januar 2011 - 13:46 #7
:)
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