SQL Server'da hangi FOREIGN KEY kısıtlamasının bir tabloya başvurduğunu nasıl öğrenebilirim?


122

Bir tabloyu düşürmeye çalışıyorum ama şu mesajı alıyorum:

Msg 3726, Düzey 16, Durum 1, Satır 3
'dbo.UserProfile' nesnesi bir FOREIGN KEY kısıtlaması tarafından başvurulduğu için bırakılamadı.
Msg 2714, Düzey 16, Durum 6, Satır 2
Veritabanında zaten 'Kullanıcı Profili' adlı bir nesne var.

SQL Server Management Studio ile etrafa baktım ama kısıtlamayı bulamıyorum. Yabancı anahtar kısıtlamalarını nasıl öğrenebilirim?


2
Sp_help 'dbo.TableName'i severim Daha fazla yol için buraya bakın: stackoverflow.com/questions/483193/…
Mark Boltuc

2
Worth noticing:@LittleSweetSeas tarafından verilen yanıt, belirli bir referans tablo İÇİN yabancı anahtarlar hakkında bilgi verecektir , ancak @ Gayathri-Varma'nın belirli bir üst tablo için yanıt ayrıntıları . Her ikisi de farklı bağlamda kullanışlıdır ve her ikisi de kendi yarışlarını kazanır :-)
Izhar Aazmi

Yanıtlar:


225

İşte burada:

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'

Bu şekilde referans tablosunu ve sütun adını alırsınız.

Yorum önerisine göre genel sys.objects yerine sys.tables kullanmak üzere düzenlendi. Teşekkürler marc_s


sys.tablessys.objects
marc_s

@marc_s: Teşekkürler ama bir örnek gönderebilir misin? Sys.tables'da AFAIK FK referansım yok
LittleSweetSeas

3
Ne ciddiydim: Sadece değiştirmek INNER JOIN sys.objects AS o ON o.OBJECT_ID = fc.referenced_object_idileINNER JOIN sys.tables t ON t.OBJECT_ID = fc.referenced_object_id
Marc_s

@LittleSweetSeas Yukarıdaki sorguyu çalıştırdım hala yabancı anahtar kısıtlaması olan tablonun object_name ve sütun adını
alamıyorum

Seçiminizi biraz daha fazla bilgi ile artırabilirsiniz: 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.referencedTobject) , COL_NAME (fc.referenced_object_id, fc.referenced_column_id) ReferencedColumn
DocOc

75

Başka bir yol da sonuçlarını kontrol etmektir.

sp_help 'TableName'

(veya sadece alıntılanan TabloAdı'nı vurgulayın ve ALT + F1'e basın)

Zaman geçtikçe cevabımı düzeltmeye karar verdim. Aşağıda, sp_helpsağlayan sonuçların bir ekran görüntüsü verilmiştir . A, bu örnek için AdventureWorksDW2012 DB'yi kullanmıştır. Orada çok sayıda iyi bilgi var ve aradığımız şey en sonunda - yeşille vurgulanmış:

görüntü açıklamasını buraya girin


3
+1 Bu birçok yararlı bilgi verir ve bu, çıktının altında yabancı anahtarları gösterir
Hux

1
Bu bana en az sayıda kod satırı hakkında çok fazla bilgi veriyor
Rennish Joseph

Bu en havalı kısa yol! Şemayı yenilemek için Ctl-R'yi tamamen yener!
Bay Young

Yerel InteliSense Önbelleğini Yenile = Ctrl + Shift + R; Ctrl + R = sonuçlar bölmesini göster / gizle (veya en azından bunlar SSMS2008 ve SSMS2014 için varsayılanlarım)
Vladislav

44

Bunu dene

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
Kısa ve zarif, artı benim için çalışıyor! Tek şey, namedöndürülen değerin bir dahili ad olması (metinkler) ve üst tablodaki gerçek sütun adı olmamasıdır. Bunu düzeltmenin bir yolu var mı?
Hamman Samuel

Burada gördüğüm şey , where cümlesinde ParentTableNameverilen ' Tablename' ile her zaman aynı olacaktır (dahil edilmişse). Bu kasıtlı olabilir ve birden fazla tablo için sorgulandığında daha faydalı olacaktır .
Izhar Aazmi

28

Bu cevabı oldukça basit buldum ve ihtiyacım olan şey için hile yaptım: https://stackoverflow.com/a/12956348/652519

Bağlantıdan bir özet, şu sorguyu kullanın:

EXEC sp_fkeys 'TableName'

Hızlı ve basit. 15 tablonun tüm yabancı anahtar tablolarını, ilgili sütunlarını ve yabancı anahtar adlarını oldukça hızlı bir şekilde bulabildim.

@Mdisibio'nun aşağıda belirtildiği gibi, kullanılabilecek farklı parametreleri detaylandıran belgelere bir bağlantı burada verilmiştir: https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp- FKeys-Transact-sQL


1
Filtrelenecek beş parametre daha var, en yararlı olanı, varsayılan olmayan bir şema belirleyebileceğiniz ikinci parametredir, örneğinEXEC sp_fkeys 'Payroll', 'accounting'
mdisibio

8

Yabancı anahtarla ilgili tüm ayrıntıları bulmak için bu komut dosyasını kullanıyorum. INFORMATION.SCHEMA kullanıyorum. Aşağıda bir SQL Komut Dosyası bulunmaktadır:

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
Yabancı anahtar olan sütunları ve sütunun referans verdiği ilgili tabloları görmenin bir yolunu arıyordum ve bu güzel bir şekilde özetliyor. Teşekkürler!
Nate Kindrew

Ederken Bu benim bazı tabloların bazı yabancı anahtarları eksik @LittleSweetSeas answer gösterince
SEAFISH

7

nesne gezgini penceresinde SSMS ile gitmek istiyorsanız, bırakmak istediğiniz nesneye sağ tıklayın, bağımlılıkları görüntüleyin.


7

Tüm Veritabanlarında Yabancı Anahtar İlişkisini bulmanın en iyi yolu burada.

exec sp_helpconstraint 'Table Name'

ve bir yol daha

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

Bu çözüm exec sp_helpconstraint 'Table Name', benim için herhangi bir satır döndüren tek çözümdür . Ancak çelişki adı anlamsızdır. 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;

1

Aşağıdakiler size aradığınızdan daha fazlasını verebilir:

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

1

Foreign Keys@LittleSweetSeas cevabını uyarlayarak ile ilgili tüm bilgileri de iade edebilirsiniz :

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

SQL Server Management Studio'da nesne gezgininde tabloya sağ tıklayıp "Bağımlılıkları Görüntüle" yi seçebilirsiniz. Bu size iyi bir başlangıç ​​noktası verir. Tabloya referans veren tabloları, görünümleri ve prosedürleri gösterir.


0

aşağıdaki sorguyu deneyin.

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

bu kısıtlama adını, başvuran sütun isimlerini ve kısıtlamaya bağlı olacak tabloları verecektir.


0

Foreign keyConstaraints'i görüntülemek için bu sorguyu kullanabilirsiniz :

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'

Alındığı http://blog.sqlauthority.com/2006/11/01/sql-server-query-to-display-foreign-key-relationships-and-name-of-the-constraint-for-each-table- veritabanı içi /


0

Bir masa almanın Primary Keyve almanın en kolay yolu Foreign Key:

/*  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

Nesne Gezgini'nde tabloyu genişletin ve Anahtarları genişletin:

görüntü açıklamasını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.