2013-07-06 6 views
59

Próbuję zrzucić stolik, ale otrzymuję następujący komunikat:Jak mogę się dowiedzieć, jakie ograniczenia FOREIGN KEY odwołuje się do tabela w SQL Server?

Msg 3726, Level 16, State 1, linia 3
nie można usunąć obiektu „dbo.UserProfile”, ponieważ jest on określany przez zagranicznego KLUCZOWE ograniczenie.
Msg 2714, poziom 16, stan 6, wiersz 2
Istnieje już obiekt o nazwie "UserProfile" w bazie danych.

Rozejrzałem się z SQL Server Management Studio, ale nie jestem w stanie znaleźć ograniczenia. Jak mogę znaleźć ograniczenia klucza obcego?

+1

Lubię sp_help 'dbo.TableName' Zobacz tutaj na wiele sposobów: http://stackoverflow.com/questions/483193/how-can-i-list-all-foreign-keys-referencing-a -given-table-in-sql-server-2005 –

+0

'Warto zauważyć:' Odpowiedź @LittleSweetSeas zwróci informację o obcych kluczach ** FOR ** danej ** odwołanej tabeli **, jednak @ Gayathri-Varma Szczegóły odpowiedzi dla danej tabeli ** dla rodziców **. Obie są użyteczne w różnych kontekstach i obie wygrywają własną rasę :-) –

Odpowiedz

120

Oto ona:

SELECT 
    OBJECT_NAME(f.parent_object_id) TableName, 
    COL_NAME(fc.parent_object_id,fc.parent_column_id) ColName 
FROM 
    sys.foreign_keys AS f 
INNER JOIN 
    sys.foreign_key_columns AS fc 
     ON f.OBJECT_ID = fc.constraint_object_id 
INNER JOIN 
    sys.tables t 
     ON t.OBJECT_ID = fc.referenced_object_id 
WHERE 
    OBJECT_NAME (f.referenced_object_id) = 'YourTableName' 

ten sposób dostaniesz nazwę tabeli katalogowanie i kolumny.

Edytowane w celu użycia sys.tables zamiast ogólnych sys.objects zgodnie z sugestią komentarza. Dzięki marc_s

+0

Powinieneś użyć bardziej skupionego 'sys.tables' zamiast' sys.objects' –

+0

@marc_s: Dziękuję, ale czy mógłbyś wysłać przykład? AFAIK w sys.tables Nie mam żadnych odniesień FK – LittleSweetSeas

+2

Co miałem na myśli: po prostu zamień 'INNER JOIN sys.objects AS o ON o IDOBJECT_ID = fc.referenced_object_id' za pomocą' INNER JOIN sys.tables t ON t.OBJECT_ID = fc. referenced_object_id' –

5

jeśli chcesz przejść przez SSMS w oknie eksploratora obiektów, kliknij prawym przyciskiem myszy obiekt, który chcesz upuścić, wykonaj zależności widoku.

32

Spróbuj

SELECT 
    object_name(parent_object_id) ParentTableName, 
    object_name(referenced_object_id) RefTableName, 
    name 
FROM sys.foreign_keys 
WHERE parent_object_id = object_id('Tablename') 
+1

Krótki i elegancki, plus działa dla mnie! Jedyną rzeczą jest zwracana wartość 'name' to nazwa wewnętrzna (metinks), a nie faktyczna nazwa kolumny w tabeli nadrzędnej. Jakikolwiek sposób to naprawić? –

+0

Myślę, że jest to lepsze rozwiązanie i powinno być oznaczone jako zaakceptowane! – Javid

+0

Co widzę tutaj, że nazwa "ParentTableName" zawsze będzie taka sama jak podana "Tablename" w klauzuli where (jeśli jest dołączona).Może to być celowe i będzie bardziej przydatne, gdy zapytano o ** więcej niż jedną tabelę **. –

3

Tutaj jest najlepszym sposobem, aby dowiedzieć się klucz obcy relacji w całej Bazie Danych.

exec sp_helpconstraint 'Table Name' 

i jeszcze jeden sposób

select * from INFORMATION_SCHEMA.KEY_COLUMN_USAGE where TABLE_NAME='Table Name' 
--and left(CONSTRAINT_NAME,2)='FK'(If you want single key) 
+0

To rozwiązanie 'exec sp_helpconstraint 'Table Name'' jest jedyną, która zwraca mi wszystkie wiersze. Jednak nazwa przeciwna to bełkot. 'PRIMARY KEY (klastrowany) \t PK__org_soft__3213E83FE6B07364' – Tor

26

Innym sposobem jest sprawdzenie wyników

sp_help 'TableName' 

(lub po prostu podkreślić cytowany TableName i pres ALT + F1)

Z upływem czasu postanowiłem udoskonalić moją odpowiedź. Poniżej znajduje się zrzut ekranu wyników, które zapewnia sp_help. W tym przykładzie użyłem DB AdventureWorksDW2012. Istnieje wiele dobrych informacji tam, a czego szukasz jest na samym końcu - podświetlone na zielono:

enter image description here

+1

+1 Daje to wiele przydatnych informacji, a to pokazuje klucze zagraniczne u dołu wyjścia – Mig

+1

Daje mi to dużo informacji w najmniejszej liczbie linii kodu –

+0

To działało dla mnie. – yantaq

1

--The Mogą dać Ci więcej, co szukasz:

create Procedure spShowRelationShips 
( 
    @Table varchar(250) = null, 
    @RelatedTable varchar(250) = null 
) 
as 
begin 
    if @Table is null and @RelatedTable is null 
     select object_name(k.constraint_object_id) ForeginKeyName, 
       object_name(k.Parent_Object_id) TableName, 
       object_name(k.referenced_object_id) RelatedTable, 
       c.Name RelatedColumnName, 
       object_name(rc.object_id) + '.' + rc.name RelatedKeyField 
     from sys.foreign_key_columns k 
     left join sys.columns c on object_name(c.object_id) = object_name(k.Parent_Object_id) and c.column_id = k.parent_column_id 
     left join sys.columns rc on object_name(rc.object_id) = object_name(k.referenced_object_id) and rc.column_id = k.referenced_column_id 
     order by 2,3 

    if @Table is not null and @RelatedTable is null 
     select object_name(k.constraint_object_id) ForeginKeyName, 
       object_name(k.Parent_Object_id) TableName, 
       object_name(k.referenced_object_id) RelatedTable, 
       c.Name RelatedColumnName, 
       object_name(rc.object_id) + '.' + rc.name RelatedKeyField 
     from sys.foreign_key_columns k 
     left join sys.columns c on object_name(c.object_id) = object_name(k.Parent_Object_id) and c.column_id = k.parent_column_id 
     left join sys.columns rc on object_name(rc.object_id) = object_name(k.referenced_object_id) and rc.column_id = k.referenced_column_id 
     where object_name(k.Parent_Object_id) [email protected] 
     order by 2,3 

    if @Table is null and @RelatedTable is not null 
     select object_name(k.constraint_object_id) ForeginKeyName, 
       object_name(k.Parent_Object_id) TableName, 
       object_name(k.referenced_object_id) RelatedTable, 
       c.Name RelatedColumnName, 
       object_name(rc.object_id) + '.' + rc.name RelatedKeyField 
     from sys.foreign_key_columns k 
     left join sys.columns c on object_name(c.object_id) = object_name(k.Parent_Object_id) and c.column_id = k.parent_column_id 
     left join sys.columns rc on object_name(rc.object_id) = object_name(k.referenced_object_id) and rc.column_id = k.referenced_column_id 
     where object_name(k.referenced_object_id) [email protected] 
     order by 2,3 



end 
17

Znalazłem odpowiedź dość prosta i wystarczyły na to, co potrzebne: https://stackoverflow.com/a/12956348/652519

podsumowanie z linku, skorzystaj z poniższego zapytania:

EXEC sp_fkeys 'TableName' 

Szybki i prosty. Byłem w stanie szybko zlokalizować wszystkie tabele obcego klucza, odpowiednie kolumny i nazwy obcego klucza z 15 tabel.

Jak @mdisibio zauważyć poniżej, oto link do dokumentacji, która zawiera szczegółowy opis różnych parametrów, które można stosować: https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-fkeys-transact-sql

+0

Idealny. Nie rozumiem, dlaczego ludzie napisali tyle własnego (ryzykownego) kodu, aby zrobić to samo, co ten proc. – ProfK

+1

Istnieje pięć innych parametrów do filtrowania, najbardziej przydatny jest drugi, w którym można określić inny niż domyślny schemat, np. 'EXEC sp_fkeys 'Payroll', 'accounting'' – mdisibio

0

wypróbuj poniższe zapytanie.

select object_name(sfc.constraint_object_id) AS constraint_name, 
     OBJECT_Name(parent_object_id) AS table_name , 
     ac1.name as table_column_name, 
     OBJECT_name(referenced_object_id) as reference_table_name,  
     ac2.name as reference_column_name 
from sys.foreign_key_columns sfc 
join sys.all_columns ac1 on (ac1.object_id=sfc.parent_object_id and ac1.column_id=sfc.parent_column_id) 
join sys.all_columns ac2 on (ac2.object_id=sfc.referenced_object_id and ac2.column_id=sfc.referenced_column_id) 
where sfc.parent_object_id=OBJECT_ID(<main table name>); 

to da constraint_name, COLUMN_NAMES które będą się odnosić i tabel, które będą w zależności od ograniczeń tam będzie.

6

Używam tego skryptu, aby znaleźć wszystkie szczegóły związane z kluczem obcym. Używam INFORMATION.SCHEMA. Poniżej jest skrypt SQL:

SELECT 
    ccu.table_name AS SourceTable 
    ,ccu.constraint_name AS SourceConstraint 
    ,ccu.column_name AS SourceColumn 
    ,kcu.table_name AS TargetTable 
    ,kcu.column_name AS TargetColumn 
FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE ccu 
    INNER JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc 
     ON ccu.CONSTRAINT_NAME = rc.CONSTRAINT_NAME 
    INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu 
     ON kcu.CONSTRAINT_NAME = rc.UNIQUE_CONSTRAINT_NAME 
ORDER BY ccu.table_name 
+2

Szukałem sposobu, aby zobaczyć kolumny, które są kluczami obcymi i powiązane tabele, które odwołuje się kolumna, i to wszystko ładnie podsumowuje. Dzięki! –

+0

Dzięki. Dokładnie tego, czego szukałem. –

0

Można użyć tej kwerendy, aby wyświetlić Foreign key constaraints:

SELECT 
K_Table = FK.TABLE_NAME, 
FK_Column = CU.COLUMN_NAME, 
PK_Table = PK.TABLE_NAME, 
PK_Column = PT.COLUMN_NAME, 
Constraint_Name = C.CONSTRAINT_NAME 
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C 
INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS FK ON C.CONSTRAINT_NAME = FK.CONSTRAINT_NAME 
INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK ON C.UNIQUE_CONSTRAINT_NAME = PK.CONSTRAINT_NAME 
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE CU ON C.CONSTRAINT_NAME = CU.CONSTRAINT_NAME 
INNER JOIN (
SELECT i1.TABLE_NAME, i2.COLUMN_NAME 
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS i1 
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE i2 ON i1.CONSTRAINT_NAME = i2.CONSTRAINT_NAME 
WHERE i1.CONSTRAINT_TYPE = 'PRIMARY KEY' 
) PT ON PT.TABLE_NAME = PK.TABLE_NAME 
---- optional: 
ORDER BY 
1,2,3,4 
WHERE PK.TABLE_NAME='YourTable' 

zaczerpnięte z http://blog.sqlauthority.com/2006/11/01/sql-server-query-to-display-foreign-key-relationships-and-name-of-the-constraint-for-each-table-in-database/

1

Można również zwrócić wszystkie informacje o Foreign Keys przez adapating @LittleSweetSeas odpowiedź:

SELECT 
    OBJECT_NAME(f.parent_object_id) ConsTable, 
    OBJECT_NAME (f.referenced_object_id) refTable, 
    COL_NAME(fc.parent_object_id,fc.parent_column_id) ColName 
FROM 
    sys.foreign_keys AS f 
INNER JOIN 
    sys.foreign_key_columns AS fc 
     ON f.OBJECT_ID = fc.constraint_object_id 
INNER JOIN 
    sys.tables t 
     ON t.OBJECT_ID = fc.referenced_object_id 
order by 
ConsTable 
1
SELECT 
    obj.name  AS FK_NAME, 
    sch.name  AS [schema_name], 
    tab1.name  AS [table], 
    col1.name  AS [column], 
    tab2.name  AS [referenced_table], 
    col2.name  AS [referenced_column] 
FROM 
    sys.foreign_key_columns fkc 
INNER JOIN sys.objects obj 
    ON obj.object_id = fkc.constraint_object_id 
INNER JOIN sys.tables tab1 
    ON tab1.object_id = fkc.parent_object_id 
INNER JOIN sys.schemas sch 
    ON tab1.schema_id = sch.schema_id 
INNER JOIN sys.columns col1 
    ON col1.column_id = parent_column_id AND col1.object_id = tab1.object_id 
INNER JOIN sys.tables tab2 
    ON tab2.object_id = fkc.referenced_object_id 
INNER JOIN sys.columns col2 
    ON col2.column_id = referenced_column_id 
     AND col2.object_id = tab2.object_id; 
+1

dzięki .. jego działanie –

0

Najłatwiej dostać Primary Key i Foreign Key na stole jest:

/* Get primary key and foreign key for a table */ 
USE DatabaseName; 

SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE CONSTRAINT_NAME LIKE 'PK%' AND 
TABLE_NAME = 'TableName' 

SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE CONSTRAINT_NAME LIKE 'FK%' AND 
TABLE_NAME = 'TableName' 
0

W SQL Server Management Studio można po prostu kliknij prawym przyciskiem myszy tabelę w Eksploratorze obiektów i wybierz „View Zależności”. To da Ci dobry punkt wyjścia. Pokazuje tabele, widoki i procedury odwołujące się do tabeli.

Powiązane problemy