একটি বিশেষ কলামে আমি কীভাবে বিদেশী কীগুলির সমস্ত নির্ভরতা পেতে পারি?
বিভিন্ন বিকল্প (কীভাবে এসএসএমএসে গ্রাফিকালি, এসকিউএল সার্ভারে কোয়েরি / ভিউ, তৃতীয় পক্ষের ডাটাবেস সরঞ্জাম,। নেট এ কোড) কী কী?
একটি বিশেষ কলামে আমি কীভাবে বিদেশী কীগুলির সমস্ত নির্ভরতা পেতে পারি?
বিভিন্ন বিকল্প (কীভাবে এসএসএমএসে গ্রাফিকালি, এসকিউএল সার্ভারে কোয়েরি / ভিউ, তৃতীয় পক্ষের ডাটাবেস সরঞ্জাম,। নেট এ কোড) কী কী?
উত্তর:
নিম্নলিখিত কোয়েরি আপনাকে শুরু করতে সহায়তা করবে। এটি বর্তমান ডাটাবেসের মধ্যে সমস্ত বিদেশী কী সম্পর্ককে তালিকাবদ্ধ করে।
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
আপনি ডাটাবেস ডায়াগ্রামগুলির মধ্যে এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিওতে গ্রাফিকভাবে সম্পর্কগুলি দেখতে পারেন।
চেষ্টা করে দেখুন: sp_help [table_name]
আপনি সমস্ত বিদেশী কী সহ টেবিল সম্পর্কিত সমস্ত তথ্য পাবেন
sp_fkeys [table]
sp_fkeys @fktable_name='TableName'
আপনি যদি কোনও টেবিল বা কলামটি মুছে ফেলার বা নাম পরিবর্তন করার পরিকল্পনা করেন তবে কেবলমাত্র বিদেশী কী নির্ভরতা সন্ধান করতে পারে।
রেফারেন্সিং টেবিলগুলি বিদেশী কী এর সাথে সংযুক্ত নয় - আপনার রেফারেন্সিং টেবিলগুলিও অনুসন্ধান করতে হবে যা বিদেশী চাবির সাথে সংযুক্ত নাও হতে পারে (আমি অনেকগুলি ডাটাবেস দেখেছি যেখানে খারাপ ডিজাইনের সাথে বিদেশী কী সংজ্ঞায়িত করা হয়নি তবে এর সাথে সম্পর্কিত ডেটা রয়েছে )। সমাধানটি সমস্ত টেবিলের কলামের নাম অনুসন্ধান এবং অনুরূপ কলামগুলির সন্ধান করতে পারে।
অন্যান্য ডাটাবেস অবজেক্টস - এটি সম্ভবত কিছুটা সামান্য বিষয় তবে আপনি যদি নির্ভরযোগ্য অবজেক্টগুলির জন্য এটি পরীক্ষা করে নেওয়া গুরুত্বপূর্ণ তবে আপনি যদি সমস্ত রেফারেন্সের সন্ধান করেন তবে।
জিইউআই সরঞ্জাম - বিদেশী চাবির সাথে সংযুক্ত টেবিলগুলি সহ সমস্ত নির্ভরশীল অবজেক্টগুলিকে সনাক্ত করতে এসএসএমএস "সম্পর্কিত বিষয়গুলি সন্ধান করুন" বিকল্প বা অ্যাপেক্সএসকিউএল অনুসন্ধান (ফ্রি সরঞ্জাম, এসএসএমএসে সংহত করে) এর মতো সরঞ্জামগুলি ব্যবহার করে দেখুন ।
আপনার প্রশ্নটি একটি একক টেবিলের দিকে এগিয়ে যাওয়ার কারণে আপনি এটি ব্যবহার করতে পারেন:
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
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
আমি সত্যিই যেটি ব্যবহার করতে পছন্দ করি তাকে রেড গেট সফ্টওয়্যার দ্বারা এসকিউএল নির্ভরতা ট্র্যাকার বলা হয় । আপনি যেকোন ডাটাবেস অবজেক্ট (গুলি) যেমন টেবিল, সঞ্চিত প্রক্রিয়া ইত্যাদিতে রাখতে পারেন এবং এটি স্বয়ংক্রিয়ভাবে আপনার নির্বাচিত আইটেমগুলিতে নির্ভর করে এমন সমস্ত অন্যান্য বস্তুর মধ্যে সম্পর্কের লাইন আঁকবে।
আপনার স্কিমায় নির্ভরতাগুলির খুব ভাল গ্রাফিকাল উপস্থাপনা দেয় ives
জন সানসোমের জন্য অনেক ধন্যবাদ, তাঁর জিজ্ঞাসা ভয়ঙ্কর!
এছাড়াও: আপনার ক্যোয়ারির শেষে আপনার "এবং PT.ORDINAL_POSITION = CU.ORDINAL_POSITION" যুক্ত করা উচিত।
আপনার যদি প্রাথমিক কীতে একাধিক ক্ষেত্র থাকে তবে এই বিবৃতিটি একে অপরের সাথে সম্পর্কিত ক্ষেত্রগুলির সাথে মিলবে (আমার ক্ষেত্রে ছিল, আপনার ক্যোয়ারীটি সমস্ত সংমিশ্রণ তৈরি করেছে, তাই প্রাথমিক কীতে 2 টি ক্ষেত্রের জন্য, আমি সম্পর্কিত বিদেশী কীটির 4 টি ফলাফল পেয়েছি) ।
(দুঃখিত, আমি যথেষ্ট পরিমাণে খ্যাতি পয়েন্ট না থাকায় জনের জবাবটি মন্তব্য করতে পারি না)।
এই ক্যোয়ারীটি একটি সারণীতে বিদেশী কী সম্পর্কিত বিশদ ফিরিয়ে দেবে, এটি একাধিক কলাম কী সমর্থন করে।
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'
দীর্ঘ অনুসন্ধানের পরে আমি একটি কাজের সমাধান পেয়েছি। আমার ডাটাবেসে সিস.ফরাইন_কি_কলামগুলি এবং তথ্য_সেমি.কি_ক্লোনম_উসেজটি কেবল প্রাথমিক কী ব্যবহার করে না।
আমি এসকিউএল সার্ভার 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
সারণির জন্য বিদেশী কী মেটাডেটা যেমন সীমাবদ্ধতার নাম, রেফারেন্স সারণী এবং রেফারেন্স কলাম ইত্যাদি পেতে আপনি 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
@ "জন স্যানসোম" উত্তরের জন্য একটি নোট,
যদি বিদেশী কী নির্ভরতা সন্ধান করা হয়, আমি মনে করি যে পিটি যেখানে ক্লজ হওয়া উচিত:
i1.CONSTRAINT_TYPE = 'FOREIGN KEY' -- instead of 'PRIMARY KEY'
এবং এটি অন শর্ত:
ON PT.TABLE_NAME = FK.TABLE_NAME – instead of PK.TABLE_NAME
বিদেশী টেবিলের প্রাথমিক কীটি সাধারণত ব্যবহৃত হয় বলে আমি মনে করি এই সমস্যাটি এর আগে লক্ষ্য করা যায় নি।
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
এটি আপনাকে দেবে:
এফকে নিজেই স্কিমা যার সাথে এফকে অন্তর্ভুক্ত