এসকিউএল এর নাম না জেনে ডিফল্ট সীমাবদ্ধতা কীভাবে ড্রপ করবেন?


196

মাইক্রোসফ্ট এসকিউএল সার্ভারে, আমি কলামটি জানতে পারি যে কোনও কলামের জন্য কোনও ডিফল্ট সীমাবদ্ধতা উপস্থিত রয়েছে এবং একটি ডিফল্ট সীমাবদ্ধতা ফেলে দেওয়া হয়েছে তা যাচাই করার জন্য:

IF EXISTS(SELECT * FROM sysconstraints
  WHERE id=OBJECT_ID('SomeTable')
  AND COL_NAME(id,colid)='ColName'
  AND OBJECTPROPERTY(constid, 'IsDefaultCnst')=1)    
ALTER TABLE SomeTable DROP CONSTRAINT DF_SomeTable_ColName

কিন্তু ডাটাবেসের পূর্ববর্তী সংস্করণগুলিতে টাইপোর কারণে, সীমাবদ্ধতার নাম হতে পারে DF_SomeTable_ColNameবা DF_SmoeTable_ColName

কোনও এসকিউএল ত্রুটি ছাড়াই আমি কীভাবে ডিফল্ট সীমাবদ্ধতা মুছতে পারি? ডিফল্ট সীমাবদ্ধতার নামগুলি INFORMATION_SCHEMA টেবিলটিতে প্রদর্শিত হয় না, যা জিনিসগুলিকে কিছুটা জটিল করে তোলে।

সুতরাং, 'এই টেবিল / কলামে ডিফল্ট সীমাবদ্ধতা মুছুন', বা 'মুছুন DF_SmoeTable_ColName' এর মতো কিছু তবে এটি যদি খুঁজে না পাওয়া যায় তবে কোনও ত্রুটি দেবেন না।


1
আমি এসকিউএল সার্ভারের সাথে দক্ষ নই, আপনি কোনও সীমাবদ্ধতার নামটি সন্ধান করার পরে কি নাম পরিবর্তন করতে পারবেন? ওরাকলে "" টেবিল সামিটেবলের পুনরায় নামকরণ বাধাকে xxx থেকে yy এ পরিবর্তন করুন "।
জুয়ারজান হার্টেল্ট

উত্তর:


262

মিচ হুইটের কোডটি প্রসারিত করে, নিম্নলিখিত স্ক্রিপ্টটি সীমাবদ্ধতা ফেলে দেওয়ার জন্য এবং এটি গতিশীলভাবে সম্পাদন করার জন্য আদেশ তৈরি করবে rate

declare @schema_name nvarchar(256)
declare @table_name nvarchar(256)
declare @col_name nvarchar(256)
declare @Command  nvarchar(1000)

set @schema_name = N'MySchema'
set @table_name = N'Department'
set @col_name = N'ModifiedDate'

select @Command = 'ALTER TABLE ' + @schema_name + '.[' + @table_name + '] DROP CONSTRAINT ' + d.name
 from sys.tables t
  join sys.default_constraints d on d.parent_object_id = t.object_id
  join sys.columns c on c.object_id = t.object_id and c.column_id = d.parent_column_id
 where t.name = @table_name
  and t.schema_id = schema_id(@schema_name)
  and c.name = @col_name

--print @Command

execute (@Command)

1
পরীক্ষা করে দেখুন stackoverflow.com/a/15786313/2049986 একটি টেবিল জন্য সব contraints ড্রপ করার জন্য একটি সংস্করণ দেখতে
জ্যাকব ভ্যান Lingen

আমি ব্যবহার sys.check_constraints না sys.default_constraints
Kiquenet

যদি কিছু কলামগুলি একাধিক ডিফল্ট সীমাবদ্ধতা বা চেক সীমাবদ্ধতা তৈরি করেতবে বৈধ নয় , কেবলমাত্রক্যোয়ারিতে শেষ সীমাবদ্ধতার জন্য কার্যকর করা হয়েছে।
কিকিনেট

4
এই ক্যোয়ারীটি কেবলমাত্র ডিফল্ট সীমাবদ্ধতাগুলিকে সম্বোধন করে, যার মধ্যে প্রতি কলামে কেবল একটিই থাকতে পারে। চেক সীমাবদ্ধতা মোকাবেলা করা একটি পৃথক সমস্যা।
ফিলিপ কেলি 14

1
অ-ডিফল্ট স্কিমা নামের জন্য সমর্থন যুক্ত করতে আমি এই উত্তরটি আপডেট করেছি। আশা করি আপনার আপত্তি নেই, আমি পছন্দ করতে চাইলে আমি আবার আলাদা করে উত্তর পোস্ট করতে পারি।
জাকুব জানুসকিউইচিজ

234

রব ফারলির ব্লগ পোস্টটি সহায়ক হতে পারে:

কিছুটা এইরকম:

 declare @table_name nvarchar(256)
 declare @col_name nvarchar(256)
 set @table_name = N'Department'
 set @col_name = N'ModifiedDate'

 select t.name, c.name, d.name, d.definition
 from 
     sys.tables t
     join sys.default_constraints d on d.parent_object_id = t.object_id
     join sys.columns c on c.object_id = t.object_id
                           and c.column_id = d.parent_column_id
 where 
     t.name = @table_name
     and c.name = @col_name

104

আমি দেখতে পেয়েছি যে এটি কাজ করে এবং এতে যোগদান করে না:

DECLARE @ObjectName NVARCHAR(100)
SELECT @ObjectName = OBJECT_NAME([default_object_id]) FROM SYS.COLUMNS
WHERE [object_id] = OBJECT_ID('[tableSchema].[tableName]') AND [name] = 'columnName';
EXEC('ALTER TABLE [tableSchema].[tableName] DROP CONSTRAINT ' + @ObjectName)

কেবল নিশ্চিত হয়ে নিন যে কলামনামের চারপাশে বন্ধনী নেই কারণ কোয়েরিটি একটি সঠিক মিলের সন্ধান করছে এবং এটি [কলামনাম] হলে কিছুই ফিরিয়ে দেবে না।


1
এবং এই উত্তরটি অন্য কোনও উত্তর থেকে পৃথক, ডিফল্ট [ডিবিও] ব্যতীত স্কিমার সাথে কাজ করে।
কনটাঙ্গো

আমি এটি পরীক্ষা করে দেখিনি, তবে আপনি চেষ্টা করতে পারেন এবং এর আশেপাশে একটি WHILE (@ObjectName নাল নয়) যোগ করতে পারেন, অবজেক্টনাম = OBJECT_Name ([ডিফল্ট ... এবং কেবল এক্সইসি চালিয়ে যান '(ALTER টি এ ... যদি (এ) ObjectName শূন্য নয়।
ScubaSteve

6
এই স্ক্রিপ্টটি আদর্শ পন্থী তৈরি করতে IF @ObjectName IS NOT NULLএক্সইসি কমান্ডের আগে যুক্ত করুন
সেভেন

3
CHECK সীমাবদ্ধতাগুলি ব্যবহার করে আমার পক্ষে কাজ করছেন না । [default_object_id])হয় 0 । আমি নুল মান পাই
কিকিনেট

মিষ্টি এবং সহজ, তবে মাইক্রোসফ্ট ডক্স অনুসারে জিনিসগুলি করার এই উপায়টি চিরকাল থাকবে না। সেখানে একটি সতর্কবার্তা যা নির্দেশ করে পরবর্তী সংস্করণে চলে যাচ্ছি হবে docs.microsoft.com/en-us/sql/t-sql/statements/...
আশাহীন

11

একাধিক কলামের জন্য সীমাবদ্ধতা ছাড়তে:

declare @table_name nvarchar(256)

declare @Command nvarchar(max) = ''

set @table_name = N'ATableName'

select @Command = @Command + 'ALTER TABLE ' + @table_name + ' drop constraint ' + d.name + CHAR(10)+ CHAR(13)
from sys.tables t
join sys.default_constraints d on d.parent_object_id = t.object_id
join sys.columns c on c.object_id = t.object_id
     and c.column_id = d.parent_column_id
where t.name = @table_name and c.name in ('column1','column2','column3')

--print @Command

execute (@Command)

5

প্রসারিত সমাধান (টেবিল স্কিমা অ্যাকাউন্টে নেয়):

-- Drop default contstraint for SchemaName.TableName.ColumnName
DECLARE @schema_name NVARCHAR(256)
DECLARE @table_name NVARCHAR(256)
DECLARE @col_name NVARCHAR(256)
DECLARE @Command  NVARCHAR(1000)

set @schema_name = N'SchemaName'
set @table_name = N'TableName'
set @col_name = N'ColumnName'

SELECT @Command = 'ALTER TABLE [' + @schema_name + '].[' + @table_name + '] DROP CONSTRAINT ' + d.name
 FROM sys.tables t   
  JOIN sys.default_constraints d       
   ON d.parent_object_id = t.object_id  
  JOIN sys.schemas s
        ON s.schema_id = t.schema_id
  JOIN    sys.columns c      
   ON c.object_id = t.object_id      
    AND c.column_id = d.parent_column_id
 WHERE t.name = @table_name
    AND s.name = @schema_name 
  AND c.name = @col_name

EXECUTE (@Command)

3

একটি ডাটাবেসে সমস্ত ডিফল্ট কনটট্রিন্টগুলি ফেলে দিন - এনভারচার (সর্বোচ্চ) প্রান্তিকের জন্য নিরাপদ।

/* WARNING: THE SAMPLE BELOW; DROPS ALL THE DEFAULT CONSTRAINTS IN A DATABASE */ 
/* MAY 03, 2013 - BY WISEROOT  */
declare @table_name nvarchar(128)
declare @column_name nvarchar(128)
declare @df_name nvarchar(128)
declare @cmd nvarchar(128) 

declare table_names cursor for 
 SELECT t.name TableName, c.name ColumnName
 FROM sys.columns c INNER JOIN
     sys.tables t ON c.object_id = t.object_id INNER JOIN
     sys.schemas s ON t.schema_id = s.schema_id
     ORDER BY T.name, c.name

     open table_names
fetch next from table_names into @table_name , @column_name
while @@fetch_status = 0
BEGIN

if exists (SELECT top(1) d.name from sys.tables t join sys.default_constraints d on d.parent_object_id = t.object_id join sys.columns c on c.object_id = t.object_id and c.column_id = d.parent_column_id where t.name = @table_name and c.name = @column_name)
BEGIN
    SET @df_name = (SELECT top(1) d.name from sys.tables t join sys.default_constraints d on d.parent_object_id = t.object_id join sys.columns c on c.object_id = t.object_id and c.column_id = d.parent_column_id where t.name = @table_name and c.name = @column_name)
    select @cmd = 'ALTER TABLE [' + @table_name +  '] DROP CONSTRAINT [' +  @df_name + ']'
    print @cmd
    EXEC sp_executeSQL @cmd;
END

  fetch next from table_names into @table_name , @column_name
END

close table_names 
deallocate table_names

যদি কিছু কলামগুলি একাধিক ডিফল্ট সীমাবদ্ধতা বা চেক সীমাবদ্ধতা তৈরি করেতবে বৈধ নয় , কেবলমাত্র ক্যোরিতে শীর্ষস্থানীয় 1 টি বাধার জন্য কার্যকর করা হয়েছে।
কিকিনেট

2

সমস্ত সীমাবদ্ধতা ব্রাউজ করতে এই কমান্ডটি চালান:

exec sp_helpconstraint 'mytable' --and look under constraint_name. 

এটা ভালো কিছু দেখতে হবে: DF__Mytable__Column__[ABC123]। তারপরে আপনি কেবল সীমাবদ্ধতা বাদ দিতে পারেন।


আমার জন্য কাজ করছে না:exec sp_helpconstraint 'Roles2016.UsersCRM'
কুইকিনেট

@ কুইকিনেট কেবল টেবিলের নাম হওয়া উচিত: এক্সিকিউটিভ_সেল্পকন্ট্রেন্ট 'রোলস ২০১6'
বেকড ইনহেল্ফ

এটি কেবল বিদেশী কী বাধা দেখায়। ডিফল্ট মান কনস্ট্যান্ট নয়
মোরেজ

2

আমি আশা করি যার জন্য একই সমস্যা রয়েছে তাদের পক্ষে এটি সহায়ক হতে পারে। ইন ObjectExplorerউইন্ডো আপনার ডাটাবেস নির্বাচন => টেবিল, => আপনার টেবিল => সীমাবদ্ধতাসমূহ। যদি গ্রাহক কলাম সময় তৈরির বিষয়ে সংজ্ঞায়িত হয় তবে আপনি কলামের নাম সহ সীমাবদ্ধতার ডিফল্ট নামটি দেখতে পারেন। তারপরে ব্যবহার করুন:

ALTER TABLE  yourTableName DROP CONSTRAINT DF__YourTa__NewCo__47127295;

(সীমাবদ্ধতার নামটি কেবল একটি উদাহরণ)


2

নিম্নলিখিত সমাধানটি সারণী থেকে একটি কলামের নির্দিষ্ট ডিফল্ট সীমাবদ্ধতা ফেলে দেবে

Declare @Const NVARCHAR(256)

SET @Const = (
              SELECT TOP 1 'ALTER TABLE' + YOUR TABLE NAME +' DROP CONSTRAINT '+name
              FROM Sys.default_constraints A
              JOIN sysconstraints B on A.parent_object_id = B.id
              WHERE id = OBJECT_ID('YOUR TABLE NAME')
              AND COL_NAME(id, colid)='COLUMN NAME'
              AND OBJECTPROPERTY(constid,'IsDefaultCnst')=1
            )
 EXEC (@Const)

0

আমার কয়েকটি কলাম রয়েছে যাতে একাধিক ডিফল্ট সীমাবদ্ধতা তৈরি হয়েছিল, তাই আমি নিম্নলিখিত সঞ্চিত পদ্ধতিটি তৈরি করি:

CREATE PROCEDURE [dbo].[RemoveDefaultConstraints] @table_name nvarchar(256), @column_name nvarchar(256)
AS
BEGIN

    DECLARE @ObjectName NVARCHAR(100)

    START: --Start of loop
    SELECT 
        @ObjectName = OBJECT_NAME([default_object_id]) 
    FROM 
        SYS.COLUMNS
    WHERE 
        [object_id] = OBJECT_ID(@table_name) 
        AND [name] = @column_name;

    -- Don't drop the constraint unless it exists
    IF @ObjectName IS NOT NULL
    BEGIN
        EXEC ('ALTER TABLE '+@table_name+' DROP CONSTRAINT ' + @ObjectName)
        GOTO START; --Used to loop in case of multiple default constraints
    END
END
GO

-- How to run the stored proc.  This removes the default constraint(s) for the enabled column on the User table.
EXEC [dbo].[RemoveDefaultConstraints] N'[dbo].[User]', N'enabled'
GO

-- If you hate the proc, just get rid of it
DROP PROCEDURE [dbo].[RemoveDefaultConstraints]
GO

0

একাধিক default constraints or check constraints তৈরি কলামের জন্য দরকারী :

পরিবর্তিত https://stackoverflow.com/a/16359095/206730 স্ক্রিপ্ট

দ্রষ্টব্য: এই স্ক্রিপ্টটি sys.check_constraints জন্য

declare @table_name nvarchar(128)
declare @column_name nvarchar(128)
declare @constraint_name nvarchar(128)
declare @constraint_definition nvarchar(512)

declare @df_name nvarchar(128)
declare @cmd nvarchar(128) 

PRINT 'DROP CONSTRAINT [Roles2016.UsersCRM].Estado'

declare constraints cursor for 
 select t.name TableName, c.name ColumnName, d.name ConstraintName, d.definition ConstraintDefinition
 from sys.tables t   
 join sys.check_constraints d  on d.parent_object_id = t.object_id  
 join sys.columns c  on c.object_id = t.object_id      
 and c.column_id = d.parent_column_id
 where t.name = N'Roles2016.UsersCRM' and c.name = N'Estado'

open constraints
fetch next from constraints into @table_name , @column_name, @constraint_name, @constraint_definition
while @@fetch_status = 0
BEGIN
    print 'CONSTRAINT: ' + @constraint_name
    select @cmd = 'ALTER TABLE [' + @table_name +  '] DROP CONSTRAINT [' +  @constraint_name + ']'
    print @cmd
    EXEC sp_executeSQL @cmd;

  fetch next from constraints into @table_name , @column_name, @constraint_name, @constraint_definition
END

close constraints 
deallocate constraints

0

আপনি চালানোর আগে সর্বদা স্ক্রিপ্ট তৈরি করুন এবং পর্যালোচনা করুন। স্ক্রিপ্টের নীচে

  select 'Alter table dbo.' + t.name + ' drop constraint '+ d.name  
  from sys.tables t
  join sys.default_constraints d on d.parent_object_id = t.object_id
  join sys.columns c on c.object_id = t.object_id
       and c.column_id = d.parent_column_id
  where c.name in ('VersionEffectiveDate','VersionEndDate','VersionReasonDesc')
  order by t.name

0
declare @table_name nvarchar(100)
declare @col_name nvarchar(100)
declare @constraint nvarchar(100)
set @table_name = N'TableName'
set @col_name = N'ColumnName'

IF EXISTS (select       c.*
    from        sys.columns c 
    inner join  sys.tables t on t.object_id = c.object_id
    where       t.name = @table_name
    and         c.name = @col_name) 
BEGIN

select @constraint=d.name
from 
sys.tables t
join sys.default_constraints d on d.parent_object_id = t.object_id
join sys.columns c on c.object_id = t.object_id
and c.column_id = d.parent_column_id
where 
t.name = @table_name
and c.name = @col_name

    IF LEN(ISNULL(@constraint, '')) <> 0
    BEGIN
        DECLARE @sqlcmd VARCHAR(MAX)
        SET @sqlcmd = 'ALTER TABLE ' + QUOTENAME(@table_name) + ' DROP CONSTRAINT' + 
        QUOTENAME(@constraint);
        EXEC (@sqlcmd);

    END

END
GO

0
declare @ery nvarchar(max)
declare @tab nvarchar(max) = 'myTable'
declare @qu nvarchar(max) = 'alter table '+@tab+' drop constraint '

select @ery = (select bj.name from sys.tables as tb 
inner join sys.objects as bj 
on tb.object_id = bj.parent_object_id
where tb.name = @tab and bj.type = 'PK')

exec(@qu+@ery)

দেখা যাক.


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