이름을 몰라도 SQL 기본 제약 조건을 삭제하는 방법은 무엇입니까? 있으므로 제약 조건의 이름은

Microsoft SQL Server에서 열에 대한 기본 제약 조건이 있는지 확인하고 기본 제약 조건을 삭제하는 쿼리는 다음과 같습니다.

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.

SQL 오류없이 기본 제약 조건을 어떻게 삭제합니까? INFORMATION_SCHEMA 테이블에는 기본 제약 조건 이름이 표시되지 않으므로 조금 까다로워집니다.

따라서 ‘이 테이블 / 열의 기본 제약 조건 삭제 DF_SmoeTable_ColName‘ 또는 ‘삭제 ‘와 같은 것이지만 찾을 수 없으면 오류가 발생하지 않습니다.



답변

다음 스크립트는 Mitch Wheat의 코드를 확장하여 구속 조건을 삭제하고 동적으로 실행하는 명령을 생성합니다.

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)


답변

Rob Farley의 블로그 게시물이 도움이 될 수 있습니다.

다음과 같은 것 :

 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


답변

나는 이것이 작동하고 조인을 사용하지 않는다는 것을 발견했다.

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)

쿼리에서 정확히 일치하는 항목을 찾고 [columnName] 인 경우 아무 것도 반환하지 않으므로 columnName에 대괄호가 없는지 확인하십시오.


답변

여러 열에 대한 제약 조건을 삭제하려면

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)


답변

확장 된 솔루션 (테이블 스키마 고려) :

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


답변

nvarchar (max) 임계 값에 대해 안전한 데이터베이스의 모든 기본 제약 조건을 삭제하십시오.

/* 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


답변

모든 구속 조건을 찾아 보려면이 명령을 실행하십시오.

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

다음과 같이 보일 것입니다 : DF__Mytable__Column__[ABC123]. 그런 다음 제약 조건을 삭제하면됩니다.