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.