[sql] 이름을 몰라도 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]. 그런 다음 제약 조건을 삭제하면됩니다.