বিদেশী কী সীমাবদ্ধতা এসকিউএল সার্ভারে কোনও সারণীর উল্লেখ করে তা আমি কীভাবে জানতে পারি?


119

আমি একটি টেবিল ফেলে দেওয়ার চেষ্টা করছি তবে নীচের বার্তাটি পেয়ে যাচ্ছি:

Msg 3726, স্তর 16, রাজ্য 1, লাইন 3
অবজেক্ট 'dbo.UserProfile' ছাড়তে পারেনি কারণ এটি একটি বিদেশী কী বাধা দ্বারা রেফারেন্স করা হয়েছে।
এমএসজি 2714, স্তর 16, রাজ্য 6, লাইন 2
ইতিমধ্যে ডেটাবেসে 'ব্যবহারকারীর প্রোফাইলে' নামে একটি অবজেক্ট রয়েছে।

আমি এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিওর সাথে চারদিকে তাকালাম তবে আমি সীমাবদ্ধতা খুঁজে পেতে পারিনি। আমি কীভাবে বিদেশী কী সীমাবদ্ধতাগুলি সন্ধান করতে পারি?


2
আমি sp_help 'dbo.TableName' এখানে আরো উপায় জন্য দেখুন মত: stackoverflow.com/questions/483193/...
মার্ক Boltuc

2
Worth noticing:@ লিটলসুইটসিজের উত্তর প্রদত্ত রেফারেন্সযুক্ত টেবিলের জন্য বিদেশী কীগুলি সম্পর্কে তথ্য ফিরিয়ে দেবে , তবে প্রদত্ত পিতামাতার সারণীর জন্য @ গায়াথ্রি-ভার্মার উত্তর বিশদ । উভয়ই বিভিন্ন প্রসঙ্গে দরকারী এবং উভয়ই তাদের নিজস্ব জাতি জয়ী :-)
ইজহার আযমি

উত্তর:


224

এটা এখানে:

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'

এইভাবে, আপনি রেফারেন্সিং সারণী এবং কলামের নাম পাবেন।

মন্তব্য পরামর্শ অনুযায়ী জেনেরিক sys.objects পরিবর্তে sys.tables ব্যবহার করতে সম্পাদিত। ধন্যবাদ, মার্ক_স


আপনার sys.tablesচেয়ে আরও বেশি কেন্দ্রীভূত করা উচিতsys.objects
মারক_স

@মার্ক_স: ধন্যবাদ, তবে আপনি কি একটি উদাহরণ পোস্ট করতে পারেন? আফাইকের সিএস টেবিলগুলিতে আমার কোনও এফকে রেফারেন্স নেই
লিটল সুইটসিয়াস

3
আমি এর অর্থ কী: মাত্র INNER JOIN sys.objects AS o ON o.OBJECT_ID = fc.referenced_object_idINNER JOIN sys.tables t ON t.OBJECT_ID = fc.referenced_object_id
মার্চ

@ লিটলসুইটসিস আমি উপরের ক্যোয়ারীটি চালিয়েছি এখনও আমি টেবিলটির জন্য অবজেক্ট_নাম এবং কলামের নাম পাচ্ছি না যা বিদেশী কী বাধা ছিল
স্মার্ট 3003

আপনি আরও কিছু তথ্যের সাহায্যে আপনার নির্বাচনটি বীফ আপ করতে পারেন: SEF f.name ConstraintName, f.type_desc ConstraintType, OBJECT_NAME (f.parent_object_id) কনস্ট্রেনটেড টেবিল, COL_NAME (fc.parent_object_id, fc.parent_column_id) সংশ্লেষ_দ্বিতীয়ম সংক্ষিপ্ত বিবরণ (সংক্ষিপ্ত বিবরণ) , COL_NAME (fc.referencesd_object_id, fc.referencesd_column_id) রেফারেন্সডকলাম
ডকোক

73

অন্য উপায় এর ফলাফল চেক করা হয়

sp_help 'TableName'

(অথবা কেবল উদ্ধৃত টেবিলের নামটি হাইলাইট করুন এবং প্রেস ALT + F1)

সময় কেটে যাওয়ার সাথে সাথে আমি কেবল আমার উত্তরটি পরিমার্জন করার সিদ্ধান্ত নিয়েছি। নীচে sp_helpসরবরাহকারী ফলাফলগুলির একটি স্ক্রিনশট রয়েছে । এ উদাহরণস্বরূপ অ্যাডভেঞ্চার ওয়ার্কসডাব্লুডাব্লু 2012 ডিবি ব্যবহার করেছেন। সেখানে প্রচুর ভাল তথ্য রয়েছে এবং আমরা যা খুঁজছি তা হ'ল একেবারে শেষে - সবুজ রঙে হাইলাইট করা:

এখানে চিত্র বর্ণনা লিখুন


3
+1 এটি প্রচুর সহায়ক তথ্য দেয় এবং এটি আউটপুটটির নীচে বিদেশী কীগুলি দেখায়
Hux

1
কোডের সর্বনিম্ন সংখ্যক রেখায় এটি আমাকে প্রচুর তথ্য দেয়
রেন্নিশ জোসেফ

এই দুর্দান্ত শর্ট কাট! স্কিমা রিফ্রেশ করার জন্য পুরোপুরি সিটিএল-আরকে মারধর করে!
মিঃ ইয়ং

রিফ্রেশ লোকাল ইন্টেলিজেন্স ক্যাশে = সিটিআরএল + শিফট + আর; Ctrl + R = ফলাফলগুলি ফলকটি দেখান / লুকান (বা কমপক্ষে এসএসএমএস ২০০৮ এবং এসএসএমএস ২০১৪ এর জন্য এটি আমার ডিফল্ট)
ভ্লাদিস্লাভ

44

এটা চেষ্টা কর

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
সংক্ষিপ্ত এবং মার্জিত, প্লাস আমার জন্য কাজ করে! কেবল nameজিনিসটিই প্রত্যাশিত মান হ'ল অভ্যন্তরীণ নাম (মিথথিন্স), এবং পিতামাতার সারণীতে প্রকৃত কলামের নাম নয়। এটা সমাধান করার জন্য কোন রাস্তা আছে?
হামান স্যামুয়েল

আমি এখানে যা দেখছি যে সেখানে ParentTableNameসর্বদা প্রদত্ত ' Tablename' র শৃঙ্খলা (যেখানে অন্তর্ভুক্ত করা হয়েছে) তে সর্বদা একই হবে । এটি ইচ্ছাকৃত হতে পারে এবং একাধিক টেবিলের জন্য জিজ্ঞাসা করা হলে এটি আরও কার্যকর হবে ।
ইজহার আজমি

28

আমি এই উত্তরটি বেশ সহজ পেয়েছি এবং আমার যা প্রয়োজন তা করার কৌশলটি করেছি: https://stackoverflow.com/a/12956348/652519

লিঙ্ক থেকে একটি সংক্ষিপ্তসার, এই কোয়েরিটি ব্যবহার করুন:

EXEC sp_fkeys 'TableName'

দ্রুত এবং সহজ। আমি খুব শীঘ্রই সমস্ত বিদেশী কী টেবিল, স্ব স্ব কলাম এবং 15 টেবিলের বিদেশী কী নামগুলি সনাক্ত করতে সক্ষম হয়েছি।

@ এমডিসিবিও যেমন নীচে উল্লিখিত হয়েছে, এখানে ডকুমেন্টেশনের একটি লিঙ্ক রয়েছে যা বিভিন্ন পরামিতিগুলি ব্যবহার করা যেতে পারে তার বিবরণ দেয়: https ://docs.mic Microsoft.com/en-us/sql/relational-datedias/system-stored-procedures/sp- fkeys-নির্বাহ করা-SQL


1
ফিল্টার করার জন্য আরও পাঁচটি পরামিতি রয়েছে, যার মধ্যে সর্বাধিক দরকারী দ্বিতীয়টি যেখানে আপনি অ-ডিফল্ট স্কিমা উল্লেখ করতে পারেন, যেমনEXEC sp_fkeys 'Payroll', 'accounting'
এমডিসিবিও

8

বিদেশী কী সম্পর্কিত সমস্ত বিবরণ সন্ধান করতে আমি এই স্ক্রিপ্টটি ব্যবহার করছি। আমি তথ্য ব্যবহার করছি CH নীচে একটি এসকিউএল স্ক্রিপ্ট রয়েছে:

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
আমি কলামগুলি যে বিদেশী কী এবং সেই সারণীটি যে কলামটি উল্লেখ করেছে সেগুলি দেখার জন্য একটি উপায় সন্ধান করছিলাম এবং এটি এটি সুন্দরভাবে উপস্থাপন করেছিল। ধন্যবাদ!
নাট কিন্ড্রু

এটি আমার কিছু টেবিলে কিছু বিদেশী কী অনুপস্থিত ছিল যখন @ লিটলসুইটসিজ উত্তরগুলি তাদের দেখিয়েছিল
সীফিশ

7

আপনি যদি এসএসএমএসের মাধ্যমে অবজেক্ট এক্সপ্লোরার উইন্ডোতে যেতে চান, আপনি যে অবজেক্টটি ফেলে দিতে চান তার ডান ক্লিক করুন, নির্ভরতা দেখুন।


7

সমস্ত ডাটাবেসে বিদেশী কী সম্পর্কটি খুঁজে বের করার সর্বোত্তম উপায়।

exec sp_helpconstraint 'Table Name'

এবং আরও একটি উপায়

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

এই সমাধানটি exec sp_helpconstraint 'Table Name'কেবলমাত্র আমার জন্য যে কোনও সারি ফেরত দেয়। তবে কনট্রিন্টের নাম গীবেরিশ ber PRIMARY KEY (clustered) PK__org_soft__3213E83FE6B07364
টোর

4
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

- নিম্নলিখিতগুলি আপনি যা সন্ধান করছেন তার আরও কিছু দিতে পারে:

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লিটলসুইটসিজ উত্তরটি মানিয়ে এই সম্পর্কিত সমস্ত তথ্যও ফেরত দিতে পারেন:

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

এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিওতে আপনি কেবল অবজেক্ট এক্সপ্লোরারের টেবিলটিতে ডান ক্লিক করতে পারেন এবং "নির্ভরতা দেখুন" নির্বাচন করতে পারেন। এটি আপনাকে একটি ভাল সূচনা পয়েন্ট দেবে। এটি সারণী উল্লেখ করে সারণী, দর্শন এবং পদ্ধতিগুলি দেখায়।


0

নিম্নলিখিত কোয়েরি চেষ্টা করুন।

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

এটি সীমাবদ্ধতা_নাম, কলাম_নাম দেয় যা উল্লেখ করবে এবং সারণিগুলি যা সীমাবদ্ধতার উপর নির্ভর করবে সেখানে থাকবে।


0

Foreign keyপ্রতিবন্ধকতা প্রদর্শন করতে আপনি এই ক্যোয়ারীটি ব্যবহার করতে পারেন :

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'

Http://blog.sqlauthority.com/2006/11/01/sql-server-query-to-display-foreign-key-referencesship-and-name-of-the-constraint-for-each-table- থেকে নেওয়া ইন-ডাটাবেসের /


0

টেবিলটি পাওয়ার Primary Keyও সহজতম উপায় 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

অবজেক্ট এক্সপ্লোরারে, টেবিলটি প্রসারিত করুন এবং কীগুলি প্রসারিত করুন:

এখানে চিত্র বর্ণনা লিখুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.