এসকিএল সার্ভারে কোনও প্রতিবন্ধকতা রয়েছে কিনা তা কীভাবে পরীক্ষা করবেন?


269

আমি এই বর্গক্ষেত্র আছে:

ALTER TABLE dbo.ChannelPlayerSkins
    DROP CONSTRAINT FK_ChannelPlayerSkins_Channels

তবে স্পষ্টতই, আমরা ব্যবহার করি এমন কিছু অন্যান্য ডাটাবেসে, সীমাবদ্ধতার আলাদা নাম রয়েছে। নামের সাথে কোনও সীমাবদ্ধতা রয়েছে কিনা তা আমি কীভাবে পরীক্ষা করব FK_ChannelPlayerSkins_Channels



এখানে একাধিক উত্তর ব্যর্থ হয় যখন একই বাধা নামটি একাধিক অবজেক্টে বা অন্য কোনও স্কিমে ব্যবহার করা হয়।
মার্ক শুলথিস

উত্তর:


352

এটা চেষ্টা কর:

SELECT
    * 
    FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS 
    WHERE CONSTRAINT_NAME ='FK_ChannelPlayerSkins_Channels'

- সম্পাদনা -

আমি যখন প্রাথমিকভাবে এই প্রশ্নের উত্তর দিয়েছিলাম তখন আমি "বিদেশী কী" ভাবছিলাম কারণ আসল প্রশ্নটি "এফকে_চ্যানেলপ্লেয়ারস্কিনস_চ্যানেলস" সন্ধানের বিষয়ে জিজ্ঞাসা করেছিল। সেই থেকে অনেক লোক এখানে অন্যান্য "প্রতিবন্ধকতাগুলি" সন্ধানের জন্য মন্তব্য করেছেন এর জন্য আরও কিছু প্রশ্ন:

--Returns one row for each CHECK, UNIQUE, PRIMARY KEY, and/or FOREIGN KEY
SELECT * 
    FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
    WHERE CONSTRAINT_NAME='XYZ'  


--Returns one row for each FOREIGN KEY constrain
SELECT * 
    FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS 
    WHERE CONSTRAINT_NAME='XYZ'


--Returns one row for each CHECK constraint 
SELECT * 
    FROM INFORMATION_SCHEMA.CHECK_CONSTRAINTS
    WHERE CONSTRAINT_NAME='XYZ'

এখানে একটি বিকল্প পদ্ধতি

--Returns 1 row for each CHECK, UNIQUE, PRIMARY KEY, FOREIGN KEY, and/or DEFAULT
SELECT 
    OBJECT_NAME(OBJECT_ID) AS NameofConstraint
        ,SCHEMA_NAME(schema_id) AS SchemaName
        ,OBJECT_NAME(parent_object_id) AS TableName
        ,type_desc AS ConstraintType
    FROM sys.objects
    WHERE type_desc LIKE '%CONSTRAINT'
        AND OBJECT_NAME(OBJECT_ID)='XYZ'

আপনার যদি আরও আরও বাধা সংক্রান্ত তথ্যের master.sys.sp_helpconstraintপ্রয়োজন হয় তবে নির্দিষ্ট তথ্য কীভাবে পাওয়া যায় তা দেখতে সিস্টেম সঞ্চিত পদ্ধতির অভ্যন্তরে সন্ধান করুন। এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিও ব্যবহার করে উত্স কোডটি দেখতে "অবজেক্ট এক্সপ্লোরার" এ প্রবেশ করুন। সেখান থেকে আপনি "মাস্টার" ডাটাবেস প্রসারিত করুন, তারপরে "প্রোগ্রামযোগ্যতা", তারপরে "সঞ্চিত পদ্ধতি", তারপরে "সিস্টেম সঞ্চিত পদ্ধতি" প্রসারিত করুন। তারপরে আপনি "sys.sp_helpconstraint" খুঁজে পেতে পারেন এবং ডানদিকে ক্লিক করুন এবং "সংশোধন" নির্বাচন করুন select এটির কোনও পরিবর্তন সংরক্ষণ না করার জন্য কেবল সাবধান হন। এছাড়াও, আপনি এই সিস্টেমটি সঞ্চিত পদ্ধতিটি যেকোন টেবিলের মতো এটি ব্যবহার করে ব্যবহার করতে পারেন EXEC sp_helpconstraint YourTableNameHere


3
একটি বিষয় লক্ষণীয়, আমার এসকিউএলটিতে এই সীমাবদ্ধতাটি যুক্ত করার জন্য, আমি নামের মতো চারপাশে বন্ধনী ব্যবহার করেছি, [fk_Client_ProjectID_Project]। আপনি যেখানে বন্ধনীটি বন্ধনী অপসারণ করতে হবে।
স্কুবাস্টেভ

2
বন্ধনীতে কোনও ভুল নেই। এটি একটি এসকিউএল সার্ভারের প্রশ্ন, মাইএসকিউএল নয়।
vlvaro González

1
যদি একটি অনন্য কনস্ট্রেইন্ট অর্থাৎ তুমি সামান্য ভিন্ন সংস্করণ প্রয়োজন: যদি না বিদ্যমান (INFORMATION_SCHEMA.TABLE_CONSTRAINTS থেকে 1 টি নির্বাচন যেখানে CONSTRAINT_NAME = 'UNIQUE_Order_ExternalReferenceId') BEGIN ALTER টেবিল অর্ডার এডিডি বাধ্যতা UNIQUE_Order_ExternalReferenceId অনন্য (ExternalReferenceId) শেষ
দ্য সংকেতপদ্ধতিরচয়িতা

2
উপরেরগুলি একটি অনন্য কলাম সীমাবদ্ধতার জন্য কাজ করে না (SQL2008)। থেকে INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE কোথায় CONSTRAINT_NAME = 'UC_constraintName' নির্বাচন *: আমি নিম্নলিখিত ব্যবহার ছিল
অ্যালান বি Dee থেকে

ডিফল্ট সীমাবদ্ধতার জন্য, তালিকাভুক্ত বিকল্প পদ্ধতিটি কেবল একটি সারি দেয়।
ChargingPun

247

সীমাবদ্ধতার অস্তিত্বের জন্য সবচেয়ে সহজ উপায় (এবং তারপরে এটি উপস্থিত থাকলে ড্রপ করার মতো কিছু করুন) OBJECT_ID () ফাংশনটি ব্যবহার করা ...

IF OBJECT_ID('dbo.[CK_ConstraintName]', 'C') IS NOT NULL 
    ALTER TABLE dbo.[tablename] DROP CONSTRAINT CK_ConstraintName

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

IF OBJECT_ID('dbo.[CK_ConstraintName]') IS NOT NULL 
    ALTER TABLE dbo.[tablename] DROP CONSTRAINT CK_ConstraintName

OBJECT_ID অন্যান্য "বাধা" যেমন বিদেশী কী বাধা বা প্রাথমিক কী বাধা ইত্যাদির সাথেও ব্যবহার করা যায় সেরা ফলাফলের জন্য সর্বদা OBJECT_ID ফাংশনের দ্বিতীয় প্যারামিটার হিসাবে উপযুক্ত অবজেক্টের ধরণটি অন্তর্ভুক্ত করুন:

বাধা অবজেক্টের ধরণ:

  • সি = চেক সীমাবদ্ধতা
  • ডি = ডিফল্ট (বাধা বা একা একা)
  • F = বিদেশী কী বাধা
  • পিকে = প্রাথমিক মূল সীমাবদ্ধতা
  • আর = বিধি (পুরানো শৈলী, একা একা)
  • ইউকিউ = অনন্য বাধা

এছাড়াও লক্ষ করুন যে স্কিমাটি প্রায়শই প্রয়োজন। সীমাবদ্ধতার স্কিমা সাধারণত পিতৃ সারণীর স্কিমা নেয়।

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


16
গুরুত্বপূর্ণ বিষয়টি হ'ল OBJECT_ID এ যেমন প্যারামিটারে স্কিমা নাম যুক্ত করা হয়: IF OBJECT_ID ('dbo.CK_ConstraintName', 'C') বাতিল নয়। স্কিমা উল্লেখ না করে এটি NULL প্রদান করে।
gator88

হাই, আপনার উত্তরের জন্য ধন্যবাদ, এটি সত্যই সহায়ক। কেবল ভাবছেন যে এটি ওরাকলের জন্য প্রযোজ্য কিনা?
অ্যালেন জিয়া

Sql2000 এ কাজ করে না। OBJECTPROPERTY(OBJECT_ID('constraint_name'), 'IsConstraint') = 1বর্তমান সংস্করণ থেকে স্ক্যুয়াল 2000 পর্যন্ত সমস্তভাবে সামঞ্জস্য হতে ব্যবহার করুন । কোনও dboস্কিমাও প্রয়োজন নেই ।
wqw

47

আপনি যদি অন্য ধরণের সীমাবদ্ধতার সন্ধান করতে চান, যেমন ডিফল্ট, আপনার আলাদা ক্যোয়ারী ব্যবহার করা উচিত ( INFORMATION_SCHEMA ব্যবহার করে আমি কীভাবে একটি ডিফল্ট সীমাবদ্ধতা পাই ? ডেভির উত্তর দিয়ে )। ব্যবহার করুন:

SELECT * FROM sys.objects WHERE type = 'D' AND name = @name

নামে একটি ডিফল্ট সীমাবদ্ধতা সন্ধান করতে।

আমি এসকিউএল স্ক্রিপ্টগুলিকে পুনরায় চালনযোগ্য করে তুলতে আমার পোস্ট " ডিডিএল" যদি উপস্থিত না থাকি "শর্তগুলিতে আলাদা আলাদা 'আইএফ না থাকলে" একসাথে রেখেছি "



19

আপনি কি এই জাতীয় কিছু দেখছেন, নীচে এসকিউএল সার্ভার 2005-এ পরীক্ষা করা হয়েছে

SELECT * FROM sys.check_constraints WHERE 
object_id = OBJECT_ID(N'[dbo].[CK_accounts]') AND 
parent_object_id = OBJECT_ID(N'[dbo]. [accounts]')

10

কিছু দেখার জন্য ......

এসকিউএল সার্ভার ২০০৮ আর 2 এসএসএমএসে, "স্ক্রিপ্ট সীমাবদ্ধতা হিসাবে -> ড্রপ এবং তৈরি করুন" কমান্ডটি টি-এসকিউএল নীচের মতো তৈরি করে

USE [MyDatabase]
GO

IF  EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[DEF_Detail_IsDeleted]') AND type = 'D')
BEGIN
ALTER TABLE [Patient].[Detail] DROP CONSTRAINT [DEF_Detail_IsDeleted]
END

GO

USE [MyDatabase]
GO

ALTER TABLE [Patient].[Detail] ADD  CONSTRAINT [DEF_Detail_IsDeleted]  DEFAULT ((0)) FOR [IsDeleted]
GO

বাক্সের বাইরে, এই স্ক্রিপ্টটি সীমাবদ্ধতা ফেলে না কারণ SELECT 0 টি সারি দেয়। (পোস্ট মাইক্রোসফ্ট সংযোগ দেখুন )।

ডিফল্ট সীমাবদ্ধতার নামটি ভুল তবে আমি সংগ্রহ করি এটিরও OBJECT_ID ফাংশনটির সাথে কিছু করার আছে কারণ নামটি পরিবর্তন করা সমস্যার সমাধান করে না।

এটি ঠিক করার জন্য, আমি OBJECT_ID- এর ব্যবহার সরিয়েছি এবং এর পরিবর্তে ডিফল্ট সীমাবদ্ধতার নাম ব্যবহার করেছি।

(SELECT * FROM dbo.sysobjects WHERE [name] = (N'DEF_Detail_IsDeleted') AND type = 'D')

1
মনে হচ্ছে স্ক্রিপ্টটি নামটি স্কিমা করে না। আপনার কাছে OBJECT_ID(N'[YourSchema].[DEF_Detail_IsDeleted]')বিভিন্ন স্কিমায় একই নামের দুটি সীমাবদ্ধতা থাকলে ব্যবহার করা নিরাপদ হবে ।
মার্টিন স্মিথ

7

আমি বিদ্যমান ক্যারিয়ারটি তৈরি করার আগে এটি পরীক্ষা করতে নীচের জিজ্ঞাসাটি ব্যবহার করি।

IF (NOT EXISTS(SELECT 1 FROM sysconstraints WHERE OBJECT_NAME(constid) = 'UX_CONSTRAINT_NAME' AND OBJECT_NAME(id) = 'TABLE_NAME')) BEGIN
...
END

প্রদত্ত টেবিলের নামটিকে লক্ষ্য করে নাম দ্বারা সীমাবদ্ধতার জন্য এই প্রশ্নগুলি। আশাকরি এটা সাহায্য করবে.


3
IF EXISTS(SELECT 1 FROM sys.foreign_keys WHERE parent_object_id = OBJECT_ID(N'dbo.TableName'))
 BEGIN 
ALTER TABLE TableName DROP CONSTRAINT CONSTRAINTNAME 
END 

3
IF EXISTS(SELECT TOP 1 1 FROM sys.default_constraints WHERE parent_object_id = OBJECT_ID(N'[dbo].[ChannelPlayerSkins]') AND name = 'FK_ChannelPlayerSkins_Channels')
BEGIN
    DROP CONSTRAINT FK_ChannelPlayerSkins_Channels
END
GO

2

INFORMATION_SCHEMAতোমার বন্ধু. এটিতে সমস্ত ধরণের ভিউ রয়েছে যা সমস্ত ধরণের স্কিমা তথ্য দেখায়। আপনার সিস্টেমের দর্শন দেখুন Check আপনি সীমাবদ্ধতার সঙ্গে তার আচরণ তিন মতামত, এক হচ্ছে আছে পাবেন CHECK_CONSTRAINTS


1

আমি এটি একটি কলামে দূরবর্তী সীমাবদ্ধতাগুলি পরীক্ষা করতে ব্যবহার করি। এটিতে আপনার যা কিছু প্রয়োজন তা থাকা উচিত।

DECLARE
  @ps_TableName VARCHAR(300)
  , @ps_ColumnName VARCHAR(300)

SET @ps_TableName = 'mytable'
SET @ps_ColumnName = 'mycolumn'

DECLARE c_ConsList CURSOR LOCAL STATIC FORWARD_ONLY FOR
    SELECT
    'ALTER TABLE ' + RTRIM(tb.name) + ' drop constraint ' + sco.name AS csql
    FROM
        sys.Objects tb
        INNER JOIN sys.Columns tc on (tb.Object_id = tc.object_id)
        INNER JOIN sys.sysconstraints sc ON (tc.Object_ID = sc.id and tc.column_id = sc.colid)
        INNER JOIN sys.objects sco ON (sc.Constid = sco.object_id)
    where
        tb.name=@ps_TableName
        AND tc.name=@ps_ColumnName
OPEN c_ConsList
FETCH c_ConsList INTO @ls_SQL
WHILE (@@FETCH_STATUS = 0) BEGIN

    IF RTRIM(ISNULL(@ls_SQL, '')) <> '' BEGIN
        EXECUTE(@ls_SQL)
    END
    FETCH c_ConsList INTO @ls_SQL
END
CLOSE c_ConsList
DEALLOCATE c_ConsList

0
SELECT tabla.name as Tabla,

        restriccion.name as Restriccion, 
        restriccion.type as Tipo, 
        restriccion.type_desc as Tipo_Desc
FROM {DATABASE_NAME}.sys.objects tabla 

INNER JOIN {DATABASE_NAME}.sys.objects restriccion

ON tabla.object_id = restriccion.parent_object_id

WHERE tabla.type = 'U' - Solo tablas creadas por el usuario.

AND restriccion.type = 'UQ' --Tipo de Restriccion UNIQUE

ORDER BY tabla.name, restriccion.type_desc                

1
এই উত্তরটি আরও কার্যকর হবে যদি কেবল ডাম্পিং কোড না দিয়ে এর সাথে কিছু ব্যাখ্যা থাকে।
স্যাম হ্যানলি

1
দ্বিতীয় @ স্প্যানলে: আপনি একটি পুরানো প্রশ্নের উত্তর দিন যা ইতিমধ্যে বেশ কয়েকটি ভাল উত্তর পেয়েছে। দয়া করে এটি উত্তম কি আপনার উত্তর সম্পর্কে নির্দিষ্ট বা সুনির্দিষ্ট নির্দিষ্ট করুন যাতে এটি পোস্ট করার উপযুক্ত worth
হনক

0

আপনি উপরের একটিটিকে একটি সতর্কতার সাথে ব্যবহার করতে পারেন:

IF EXISTS(
    SELECT 1 FROM sys.foreign_keys 
    WHERE parent_object_id = OBJECT_ID(N'dbo.TableName') 
        AND name = 'CONSTRAINTNAME'
)
BEGIN 
    ALTER TABLE TableName DROP CONSTRAINT CONSTRAINTNAME 
END 

ব্যবহার করা প্রয়োজন name = [Constraint name] যেহেতু একটি টেবিল একাধিক বিদেশী কী থাকতে পারে এবং এখনও বিদেশী কী-এর জন্য পরীক্ষা করা হচ্ছে না

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