Bagaimana cara mengetahui batasan FOREIGN KEY apa yang mereferensikan tabel di SQL Server?

121

Saya mencoba untuk menjatuhkan tabel tetapi mendapatkan pesan berikut:

Psn 3726, Level 16,
Status 1, Baris 3 Tidak dapat menghapus objek 'dbo.UserProfile' karena direferensikan oleh batasan FOREIGN KEY.
Psn 2714, Level 16, Status 6, Baris 2
Sudah ada objek bernama 'ProfilPengguna' dalam database.

Saya melihat sekeliling dengan SQL Server Management Studio tetapi saya tidak dapat menemukan kendala. Bagaimana saya bisa mengetahui kendala kunci asing?

marc_s
sumber
2
Saya suka sp_help 'dbo.TableName' Lihat di sini untuk lebih banyak cara: stackoverflow.com/questions/483193/…
Mark Boltuc
2
Worth noticing:Jawaban oleh @LittleSweetSeas akan mengembalikan info tentang kunci asing UNTUK tabel referensi tertentu , namun rincian jawaban @ Gayathri-Varma untuk tabel induk tertentu . Keduanya berguna dalam konteks yang berbeda dan keduanya memenangkan balapan mereka sendiri :-)
Izhar Aazmi

Jawaban:

225

Ini dia:

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'

Dengan cara ini, Anda akan mendapatkan tabel referensi dan nama kolom.

Diedit untuk menggunakan sys.tables dan bukan sys.objects umum sesuai saran komentar. Terima kasih, marc_s

LittleSweetSeas
sumber
Anda harus menggunakan lebih fokus sys.tablesdaripadasys.objects
marc_s
@marc_s: Terima kasih, tetapi bisakah Anda memposting contoh? AFAIK di sys.tables saya tidak punya referensi FK
LittleSweetSeas
3
Maksud saya: ganti saja INNER JOIN sys.objects AS o ON o.OBJECT_ID = fc.referenced_object_iddenganINNER JOIN sys.tables t ON t.OBJECT_ID = fc.referenced_object_id
marc_s
@LittleSweetSeas saya telah menjalankan kueri di atas masih saya tidak mendapatkan object_name dan nama kolom untuk tabel yang memiliki batasan kunci asing
Smart003
Anda dapat meningkatkan pilihan Anda dengan sedikit lebih banyak info: SELECT f.name ConstraintName, f.type_desc ConstraintType, OBJECT_NAME (f.parent_object_id) ConstrainedTable, COL_NAME (fc.parent_object_id, fc.parent_column_id) ConstrainedColumn, OBJECT_NAME (f.referenced) Referenced_id , COL_NAME (fc.referenced_object_id, fc.referenced_column_id) ReferencedColumn
DocOc
74

Cara lain adalah dengan memeriksa hasil

sp_help 'TableName'

(atau cukup sorot TableName yang dikutip dan pres ALT + F1)

Dengan berlalunya waktu, saya memutuskan untuk memperbaiki jawaban saya. Di bawah ini adalah tangkapan layar dari hasil yang sp_helpdiberikan. A telah menggunakan AdventureWorksDW2012 DB untuk contoh ini. Ada banyak informasi bagus di sana, dan yang kami cari ada di bagian paling akhir - disorot dengan warna hijau:

masukkan deskripsi gambar di sini

Vladislav
sumber
3
+1 Ini memberikan banyak informasi berguna dan ini menunjukkan kunci asing di bagian bawah output
Hux
1
Ini memberi saya banyak info dalam jumlah baris kode
terkecil
Ini jalan pintas paling keren! Benar-benar mengalahkan Ctl-R untuk menyegarkan skema!
Tuan Muda
Segarkan Cache InteliSense Lokal = Ctrl + Shift + R; Ctrl + R = tampilkan / sembunyikan panel hasil (atau setidaknya ini adalah default saya untuk SSMS2008 dan SSMS2014)
Vladislav
44

Coba ini

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')
Gayathri L
sumber
1
Pendek dan elegan, plus cocok untukku! Hanya saja namenilai yang dikembalikan adalah nama internal (methinks), dan bukan nama kolom sebenarnya di tabel induk. Adakah cara untuk memperbaikinya?
Hamman Samuel
Apa yang saya lihat di sini bahwa ParentTableNameakan selalu sama dengan yang diberikan ' Tablename' di klausa where (jika disertakan). Ini mungkin disengaja, dan akan lebih berguna ketika ditanyai untuk lebih dari satu tabel.
Izhar Aazmi
28

Saya menemukan jawaban ini cukup sederhana dan melakukan trik untuk apa yang saya butuhkan: https://stackoverflow.com/a/12956348/652519

Ringkasan dari tautan, gunakan kueri ini:

EXEC sp_fkeys 'TableName'

Cepat dan sederhana. Saya dapat menemukan semua tabel kunci asing, masing-masing kolom dan nama kunci asing dari 15 tabel dengan cukup cepat.

Seperti yang disebutkan @mdisibio di bawah ini, berikut adalah tautan ke dokumentasi yang merinci parameter berbeda yang dapat digunakan: https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp- fkeys-transact-sql

Michael
sumber
1
Ada lima parameter lain untuk difilter, yang paling berguna untuk diketahui adalah yang kedua di mana Anda dapat menentukan skema non-default, misalnyaEXEC sp_fkeys 'Payroll', 'accounting'
mdisibio
8

Saya menggunakan skrip ini untuk menemukan semua detail yang terkait dengan kunci asing. Saya menggunakan INFORMATION.SCHEMA. Di bawah ini adalah SQL Script:

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
Anvesh
sumber
2
Saya sedang mencari cara untuk melihat kolom yang merupakan kunci asing dan tabel terkait yang direferensikan oleh kolom, dan ini merangkumnya dengan baik. Terima kasih!
Nate Kindrew
Ini kehilangan beberapa kunci asing di beberapa tabel saya sementara jawaban @LittleSweetSeas menunjukkan mereka
Seafish
7

jika Anda ingin melalui SSMS pada jendela objek explorer, klik kanan pada objek yang ingin Anda letakkan, lakukan view dependencies.

Luis LL
sumber
7

Berikut adalah cara terbaik untuk mengetahui Hubungan Kunci Asing di semua Database.

exec sp_helpconstraint 'Table Name'

dan satu cara lagi

select * from INFORMATION_SCHEMA.KEY_COLUMN_USAGE where TABLE_NAME='Table Name'
--and left(CONSTRAINT_NAME,2)='FK'(If you want single key)
Vinoth_S
sumber
Solusi ini exec sp_helpconstraint 'Table Name'adalah satu-satunya yang mengembalikan baris apa pun untuk saya. Namun nama yang kontras itu tidak jelas. PRIMARY KEY (clustered) PK__org_soft__3213E83FE6B07364
Tor
5
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;
Murali_DBA
sumber
1

--Berikut ini mungkin memberi Anda lebih banyak dari apa yang Anda cari:

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) =@Table
        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) =@RelatedTable
        order by 2,3



end
Mike
sumber
1

Anda juga dapat mengembalikan semua informasi tentang itu Foreign Keysdengan mengikuti jawaban @LittleSweetSeas:

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
pengguna1
sumber
1

Di SQL Server Management Studio Anda cukup mengklik kanan tabel di objek explorer dan memilih "View Dependencies". Ini akan memberi Anda titik awal yang baik. Ini memperlihatkan tabel, tampilan, dan prosedur yang mereferensikan tabel.

Darrel Lee
sumber
0

coba pertanyaan berikut.

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>);

ini akan memberikan nama_konstrain, nama_kolom yang akan merujuk dan tabel yang bergantung pada batasan akan ada di sana.

Smart003
sumber
0

Anda dapat menggunakan kueri ini untuk menampilkan Foreign keykonstanta:

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'

Diambil dari http://blog.sqlauthority.com/2006/11/01/sql-server-query-to-display-foreign-key-relationships-and-name-of-the-constraint-for-each-table- dalam-database /

pengguna1
sumber
0

Cara termudah untuk mendapatkan Primary Keydan mendapatkan Foreign Keymeja adalah:

/*  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'
Ashraf Abusada
sumber
0

Di Object Explorer, perluas tabel, dan perluas Keys:

masukkan deskripsi gambar di sini

Hank Z
sumber