কীভাবে এসকিউএল সার্ভারে বিদেশী কী নির্ভরতা পাবেন?


163

একটি বিশেষ কলামে আমি কীভাবে বিদেশী কীগুলির সমস্ত নির্ভরতা পেতে পারি?

বিভিন্ন বিকল্প (কীভাবে এসএসএমএসে গ্রাফিকালি, এসকিউএল সার্ভারে কোয়েরি / ভিউ, তৃতীয় পক্ষের ডাটাবেস সরঞ্জাম,। নেট এ কোড) কী কী?

উত্তর:


290

নিম্নলিখিত কোয়েরি আপনাকে শুরু করতে সহায়তা করবে। এটি বর্তমান ডাটাবেসের মধ্যে সমস্ত বিদেশী কী সম্পর্ককে তালিকাবদ্ধ করে।

SELECT
    FK_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

আপনি ডাটাবেস ডায়াগ্রামগুলির মধ্যে এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিওতে গ্রাফিকভাবে সম্পর্কগুলি দেখতে পারেন।


8
ধন্যবাদ! নির্দিষ্ট কলামটি পাওয়ার জন্য আমাকে কেবল << WHERE FK.TABLE_NAME = 'MyTable' এবং CU.COLUMN_NAME = 'মাই কলাম' >> যুক্ত করতে হবে।
এমনকি Mien,

1
+1 টি! এবং যদি নির্দিষ্ট কলামটি পেতে প্রয়োজন হয় তবে সমস্ত টেবিলের জন্য, "WHERE CU.COLUMN_NAME = 'মাই কলাম'" করত।
লিয়াং

1
এমনকি - এর মতোই আমিও WHERE PK.TABLE_NAME = 'MyTable' ব্যবহার করে টেবিলের উপর নির্ভরশীল find
ল্যানসোম্যাগনেফিকো

7
@ সমকিতশাহ: কেউ তা বলে নি। প্রশ্নটি ট্যাগ করা স্কেল-সার্ভার, যা সংজ্ঞা অনুসারে মাইক্রোসফ্ট প্রযুক্তি। পোস্টগ্রিসের সাথে এর কোনও সম্পর্ক নেই।
নিওলিস্ক

2
-1: এই ক্যোয়ারীটি বিদেশী কীগুলি মিস করেছে যা রেফারেন্স সারণীতে প্রাথমিক কীয়ের পরিবর্তে কোনও অনন্য বাধা বা অনন্য সূচক দ্বারা ব্যাক করা হয়েছে। প্রতি দুটিই MSDN : "একজন বিদেশী কী বাধ্যতা অন্য টেবিলে একটি প্রাথমিক কী বাধ্যতা একমাত্র লিঙ্ক করা নেই; অন্য টেবিলে একটি অনন্য বাধার কলামগুলি উল্লেখ করার জন্য এটি সংজ্ঞায়িতও করা যেতে পারে। " উত্তরটি শেষ জয়েনটি সরিয়ে অনন্য প্রতিবন্ধকতাগুলির সাথে এবং শেষ দুটি যোগদানকে সরিয়ে অনন্য সূচী দিয়ে কাজ করার জন্য তৈরি করা যেতে পারে, তবে এটি প্রত্যাবর্তিত তথ্যকে সীমাবদ্ধ করে।
ডগলাস

100

চেষ্টা করে দেখুন: sp_help [table_name]

আপনি সমস্ত বিদেশী কী সহ টেবিল সম্পর্কিত সমস্ত তথ্য পাবেন


2
খুব সুন্দর, খুব দরকারী চিহ্নিত উত্তর চেয়ে বেশি স্মরণীয়! বিশ্বাস করতে পারবেন না আপনি তাদের এসএসএসে দেখতে পারবেন না!
JonnyRaa

4
খুব সুন্দর ধন্যবাদ. তবে sp_fkeys [table]
এফকে'র সন্ধানের

.... বা যদি আপনি এর থেকে কোনও ফলাফল না পান (তবে এসপি_হেল্প বিদেশী কীগুলি দেখায়), পূর্ণ সংস্করণটি সাহায্য করতে পারে:sp_fkeys @fktable_name='TableName'
আজভি জেসি

চমত্কার! সংক্ষিপ্ত এবং সংক্ষিপ্ত!
জেরোফ্লা

39

আপনি যদি কোনও টেবিল বা কলামটি মুছে ফেলার বা নাম পরিবর্তন করার পরিকল্পনা করেন তবে কেবলমাত্র বিদেশী কী নির্ভরতা সন্ধান করতে পারে।

রেফারেন্সিং টেবিলগুলি বিদেশী কী এর সাথে সংযুক্ত নয় - আপনার রেফারেন্সিং টেবিলগুলিও অনুসন্ধান করতে হবে যা বিদেশী চাবির সাথে সংযুক্ত নাও হতে পারে (আমি অনেকগুলি ডাটাবেস দেখেছি যেখানে খারাপ ডিজাইনের সাথে বিদেশী কী সংজ্ঞায়িত করা হয়নি তবে এর সাথে সম্পর্কিত ডেটা রয়েছে )। সমাধানটি সমস্ত টেবিলের কলামের নাম অনুসন্ধান এবং অনুরূপ কলামগুলির সন্ধান করতে পারে।

অন্যান্য ডাটাবেস অবজেক্টস - এটি সম্ভবত কিছুটা সামান্য বিষয় তবে আপনি যদি নির্ভরযোগ্য অবজেক্টগুলির জন্য এটি পরীক্ষা করে নেওয়া গুরুত্বপূর্ণ তবে আপনি যদি সমস্ত রেফারেন্সের সন্ধান করেন তবে।

জিইউআই সরঞ্জাম - বিদেশী চাবির সাথে সংযুক্ত টেবিলগুলি সহ সমস্ত নির্ভরশীল অবজেক্টগুলিকে সনাক্ত করতে এসএসএমএস "সম্পর্কিত বিষয়গুলি সন্ধান করুন" বিকল্প বা অ্যাপেক্সএসকিউএল অনুসন্ধান (ফ্রি সরঞ্জাম, এসএসএমএসে সংহত করে) এর মতো সরঞ্জামগুলি ব্যবহার করে দেখুন ।


39

আপনার প্রশ্নটি একটি একক টেবিলের দিকে এগিয়ে যাওয়ার কারণে আপনি এটি ব্যবহার করতে পারেন:

EXEC sp_fkeys 'TableName'

আমি এটি এখানে পেয়েছি:

https://stackoverflow.com/a/12956348/652519

আমার প্রয়োজনীয় তথ্যগুলি খুব দ্রুত খুঁজে পেয়েছি। এটি বিদেশী কী এর টেবিল, কলাম এবং নাম তালিকাভুক্ত করে।

সম্পাদনা

এখানে ডকুমেন্টেশনের একটি লিঙ্ক রয়েছে যা বিভিন্ন পরামিতিগুলি ব্যবহার করা যেতে পারে তার বিবরণ দেয়: https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-fkeys-transact-sql


29

আমি মনে করি এই স্ক্রিপ্টটি কম ব্যয়বহুল:

SELECT f.name AS ForeignKey, OBJECT_NAME(f.parent_object_id) AS TableName,
    COL_NAME(fc.parent_object_id, fc.parent_column_id) AS ColumnName,
    OBJECT_NAME (f.referenced_object_id) AS ReferenceTableName,
    COL_NAME(fc.referenced_object_id, fc.referenced_column_id) AS ReferenceColumnName
FROM sys.foreign_keys AS f
INNER JOIN sys.foreign_key_columns AS fc
ON f.OBJECT_ID = fc.constraint_object_id

6

আমি সত্যিই যেটি ব্যবহার করতে পছন্দ করি তাকে রেড গেট সফ্টওয়্যার দ্বারা এসকিউএল নির্ভরতা ট্র্যাকার বলা হয় । আপনি যেকোন ডাটাবেস অবজেক্ট (গুলি) যেমন টেবিল, সঞ্চিত প্রক্রিয়া ইত্যাদিতে রাখতে পারেন এবং এটি স্বয়ংক্রিয়ভাবে আপনার নির্বাচিত আইটেমগুলিতে নির্ভর করে এমন সমস্ত অন্যান্য বস্তুর মধ্যে সম্পর্কের লাইন আঁকবে।

আপনার স্কিমায় নির্ভরতাগুলির খুব ভাল গ্রাফিকাল উপস্থাপনা দেয় ives


2
এটি অ-প্রযুক্তিগত লোকদের দেখানোর জন্য একটি দুর্দান্ত সরঞ্জাম যে তাদের সমস্ত ডেটাবেস ডিজাইনটি পড়ে যাওয়ার আগে তাদের পুনরুদ্ধার করার জন্য কিছু অর্থ ব্যয় করতে হবে। এটি তৈরি করা গ্রাফগুলি বেশ জোরালো।
রব অ্যালেন

1
রব: আমি সেখানে একটি সম্পূর্ণ ডাটাবেস স্কিমা লোড করা এবং তারপরে বিভিন্ন বিন্যাসের মধ্যে পরিবর্তন করতে চাই যাতে আমি সমস্ত জিনিস প্রায় চারদিকে উড়ে যেতে পারি।
TheTXI

4

জন সানসোমের জন্য অনেক ধন্যবাদ, তাঁর জিজ্ঞাসা ভয়ঙ্কর!

এছাড়াও: আপনার ক্যোয়ারির শেষে আপনার "এবং PT.ORDINAL_POSITION = CU.ORDINAL_POSITION" যুক্ত করা উচিত।

আপনার যদি প্রাথমিক কীতে একাধিক ক্ষেত্র থাকে তবে এই বিবৃতিটি একে অপরের সাথে সম্পর্কিত ক্ষেত্রগুলির সাথে মিলবে (আমার ক্ষেত্রে ছিল, আপনার ক্যোয়ারীটি সমস্ত সংমিশ্রণ তৈরি করেছে, তাই প্রাথমিক কীতে 2 টি ক্ষেত্রের জন্য, আমি সম্পর্কিত বিদেশী কীটির 4 টি ফলাফল পেয়েছি) ।

(দুঃখিত, আমি যথেষ্ট পরিমাণে খ্যাতি পয়েন্ট না থাকায় জনের জবাবটি মন্তব্য করতে পারি না)।


3

এই ক্যোয়ারীটি একটি সারণীতে বিদেশী কী সম্পর্কিত বিশদ ফিরিয়ে দেবে, এটি একাধিক কলাম কী সমর্থন করে।

    SELECT *
    FROM
    (
    SELECT 
    T1.constraint_name ConstraintName,
    T2.COLUMN_NAME ColumnName,
    T3.TABLE_NAME RefTableName, 
    T3.COLUMN_NAME RefColumnName,
    T1.MATCH_OPTION MatchOption, 
    T1.UPDATE_RULE UpdateRule, 
    T1.DELETE_RULE DeleteRule
    FROM 
    INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS T1
    INNER JOIN
    INFORMATION_SCHEMA.KEY_COLUMN_USAGE T2 
    ON T1.CONSTRAINT_NAME = T2.CONSTRAINT_NAME
    INNER JOIN
    INFORMATION_SCHEMA.KEY_COLUMN_USAGE T3 
    ON T1.UNIQUE_CONSTRAINT_NAME = T3.CONSTRAINT_NAME 
    AND T2.ORDINAL_POSITION = T3.ORDINAL_POSITION) A
    WHERE A.ConstraintName = 'table_name'

2

দীর্ঘ অনুসন্ধানের পরে আমি একটি কাজের সমাধান পেয়েছি। আমার ডাটাবেসে সিস.ফরাইন_কি_কলামগুলি এবং তথ্য_সেমি.কি_ক্লোনম_উসেজটি কেবল প্রাথমিক কী ব্যবহার করে না।

আমি এসকিউএল সার্ভার 2015 ব্যবহার করি

সমাধান 1 (খুব কম ব্যবহৃত)

অন্যান্য সমাধানগুলি যদি কাজ না করে তবে এটি কার্যকর হবে:

        WITH CTE AS
        (
            SELECT 
                TAB.schema_id,
                TAB.name,
                COL.name AS COLNAME,
                COl.is_identity
            FROM 
                sys.tables TAB INNER JOIN sys.columns COL 
                    ON TAB.object_id = COL.object_id
        )
        SELECT 
            DB_NAME() AS [Database], 
            SCHEMA_NAME(Child.schema_id) AS 'Schema',
            Child.name AS 'ChildTable',
            Child.COLNAME AS 'ChildColumn',
            Parent.name AS 'ParentTable',
            Parent.COLNAME AS 'ParentColumn'
        FROM 
            cte Child INNER JOIN CTE Parent
                ON 
                    Child.COLNAME=Parent.COLNAME AND 
                    Child.name<>Parent.name AND 
                    Child.is_identity+1=Parent.is_identity

সমাধান 2 (সাধারণত ব্যবহৃত)

বেশিরভাগ ক্ষেত্রে এটি ঠিক কাজ করবে:

        SELECT
            DB_NAME() AS [Database], 
            SCHEMA_NAME(fk.schema_id) AS 'Schema',
            fk.name 'Name',
            tp.name 'ParentTable',
            cp.name 'ParentColumn',
            cp.column_id,
            tr.name 'ChildTable',
            cr.name 'ChildColumn',
            cr.column_id
        FROM
            sys.foreign_keys fk
        INNER JOIN
            sys.tables tp ON fk.parent_object_id = tp.object_id
        INNER JOIN
            sys.tables tr ON fk.referenced_object_id = tr.object_id
        INNER JOIN
            sys.foreign_key_columns fkc ON fkc.constraint_object_id = fk.object_id
        INNER JOIN
            sys.columns cp ON fkc.parent_column_id = cp.column_id AND fkc.parent_object_id = cp.object_id
        INNER JOIN
            sys.columns cr ON fkc.referenced_column_id = cr.column_id AND fkc.referenced_object_id = cr.object_id
        WHERE 
            -- CONCAT(SCHEMA_NAME(fk.schema_id), '.', tp.name, '.', cp.name) LIKE '%my_table_name%' OR
            -- CONCAT(SCHEMA_NAME(fk.schema_id), '.', tr.name, '.', cr.name) LIKE '%my_table_name%' 
        ORDER BY
            tp.name, cp.column_id

2

সারণির জন্য বিদেশী কী মেটাডেটা যেমন সীমাবদ্ধতার নাম, রেফারেন্স সারণী এবং রেফারেন্স কলাম ইত্যাদি পেতে আপনি INFORMATION_SCHEMA.KEY_COLUMN_USAGE এবং sys.foreign_key_colम ব্যবহার করতে পারেন etc.

কোয়েরির নীচে:

SELECT  CONSTRAINT_NAME, COLUMN_NAME, ParentTableName, RefTableName,RefColName FROM 
    (SELECT CONSTRAINT_NAME,COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_NAME = '<tableName>') constraint_details
    INNER JOIN  
    (SELECT ParentTableName, RefTableName,name ,COL_NAME(fc.referenced_object_id,fc.referenced_column_id) RefColName  FROM (SELECT object_name(parent_object_id) ParentTableName,object_name(referenced_object_id) RefTableName,name,OBJECT_ID  FROM sys.foreign_keys WHERE parent_object_id = object_id('<tableName>') ) f 
    INNER JOIN   
    sys.foreign_key_columns AS fc  ON  f.OBJECT_ID = fc.constraint_object_id ) foreign_key_detail 
    on foreign_key_detail.name = constraint_details.CONSTRAINT_NAME

1

@ "জন স্যানসোম" উত্তরের জন্য একটি নোট,

যদি বিদেশী কী নির্ভরতা সন্ধান করা হয়, আমি মনে করি যে পিটি যেখানে ক্লজ হওয়া উচিত:

i1.CONSTRAINT_TYPE = 'FOREIGN KEY'  -- instead of 'PRIMARY KEY'

এবং এটি অন শর্ত:

ON PT.TABLE_NAME = FK.TABLE_NAME  instead of PK.TABLE_NAME

বিদেশী টেবিলের প্রাথমিক কীটি সাধারণত ব্যবহৃত হয় বলে আমি মনে করি এই সমস্যাটি এর আগে লক্ষ্য করা যায় নি।


0
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

ইউএসই তথ্য_সেমিমা;

SELECT COLUMN_NAME, REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME
FROM KEY_COLUMN_USAGE
WHERE (table_name = *tablename*) AND NOT (REFERENCED_TABLE_NAME IS NULL)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.