Programing

T-SQL에서 기본값 또는 유사한 제약 조건을 어떻게 삭제합니까?

lottogame 2020. 11. 18. 08:19
반응형

T-SQL에서 기본값 또는 유사한 제약 조건을 어떻게 삭제합니까?


구문을 알고 있습니다.

ALTER TABLE [TheTable] DROP CONSTRAINT [TheDefaultConstraint]

하지만 이름을 모르는 경우 기본 제약 조건을 삭제하는 방법은 무엇입니까? (즉, CREATE TABLE시간 에 자동 생성되었습니다 .)


이 작업을 수동으로 수행하려는 경우 Management Studio를 사용하여 찾을 수 있습니다 (테이블 내부의 제약 조건 노드 아래).

SQL을 사용하여 수행하려면 :

  • 제약 조건이 기본 제약 조건 인 경우를 사용 sys.default_constraints하여 찾을 수 있습니다.

    SELECT OBJECT_NAME(parent_object_id) AS TableName, name AS ConstraintName
    FROM sys.default_constraints ORDER BY TableName, ConstraintName
    
  • 다른 제약 조건 (검사, 고유, 외래 키, 기본값, 기본 키)도 찾고 있다면 다음을 사용할 수 있습니다 sysconstraints.

    SELECT OBJECT_NAME(id) AS TableName, OBJECT_NAME(constid) AS ConstraintName
    FROM sysconstraints ORDER BY TableName, ConstraintName
    

사용중인 SQL Server 버전을 말하지 않습니다. 위의 작업은 SQL 2005 및 SQL 2008 모두에서 작동합니다.


이 코드를 사용하여 자동으로 수행 할 수 있습니다.

DECLARE @tableName VARCHAR(MAX) = '<MYTABLENAME>'
DECLARE @columnName VARCHAR(MAX) = '<MYCOLUMNAME>'
DECLARE @ConstraintName nvarchar(200)
SELECT @ConstraintName = Name 
FROM SYS.DEFAULT_CONSTRAINTS
WHERE PARENT_OBJECT_ID = OBJECT_ID(@tableName) 
AND PARENT_COLUMN_ID = (
    SELECT column_id FROM sys.columns
    WHERE NAME = @columnName AND object_id = OBJECT_ID(@tableName))
IF @ConstraintName IS NOT NULL
    EXEC('ALTER TABLE '+@tableName+' DROP CONSTRAINT ' + @ConstraintName)

그냥 교체 <MYTABLENAME><MYCOLUMNNAME>적절한.


또는 sys.check_constraints 카탈로그 뷰를 사용하여 찾을 수 있습니다.


sp_help [테이블 이름]에서 제약 조건의 이름을 찾은 다음 이름으로 삭제할 수 있습니다.

또는 Management Studio를 통해이 작업을 수행 할 수 있습니다.


한 줄의 단일 테이블 및 열에 대해 다음을 사용하십시오.

declare @sql nvarchar(max); set @sql = ''; SELECT @sql+='ALTER TABLE [dbo].[YOURTABLENAME] DROP CONSTRAINT ' + ((SELECT OBJECT_NAME(constid) FROM sysconstraints WHERE OBJECT_NAME(id) = 'YOURTABLENAME'AND colid IN (SELECT ORDINAL_POSITION FROM INFORMATION_SCHEMA.COLUMNS Where Table_Name = 'YOURTABLENAME' and COLUMN_NAME = 'YOURCOLUMNNAM'))) + ';'; EXEC sp_executesql @sql;

열에 여러 제약 조건이있는 경우 원하는 제약 조건을 구별해야하지만 기본 제약 조건 만 있으면 트릭을 수행 할 수 있습니다.

더 자세히 구별 할 수 있도록 information_schema에서 사용 가능한 다른 열을 확인하십시오.


여기에 모든 종속 제약 조건을 삭제하는 내 버전이 있습니다. 기본 제약 조건 (존재하는 경우) 및 영향을받는 모든 검사 제약 조건 (SQL 표준이 제안하는 것처럼 보이고 다른 데이터베이스가 그렇게 보이는 것처럼)

declare @constraints varchar(4000);
declare @sql varchar(4000);
with table_id_column_position as (
   select object_id table_id, column_id column_position
      from sys.columns where object_id is not null and object_id = object_id('TableName') and name = 'ColumnToBeDropped'
)
select @constraints = coalesce(@constraints, 'constraint ') + '[' + name + '], '
from sysobjects 
where (
  -- is CHECK constraint
  type = 'C' 
  -- dependeds on the column
  and id is not null
  and id in (
      select object_id --, object_name(object_id)
      from sys.sql_dependencies, table_id_column_position 
      where object_id is not null
      and referenced_major_id = table_id_column_position.table_id
      and referenced_minor_id = table_id_column_position.column_position
    )
) OR (
  -- is DEFAULT constraint
  type = 'D'
  and id is not null
  and id in (
    select object_id
    from sys.default_constraints, table_id_column_position
     where object_id is not null
     and parent_object_id = table_id_column_position.table_id
     and parent_column_id = table_id_column_position.column_position
  )
);
set @sql = 'alter table TableName drop ' + coalesce(@constraints, '') + ' column ColumnToBeDropped';
exec @sql

(주의 : 위의 코드에서 TableNameColumnToBeDropped두 번 모두 표시됨)

This works by constructing single ALTER TABLE TableName DROP CONSTRAINT c1, ..., COLUMN ColumnToBeDropped and executing it.

참고URL : https://stackoverflow.com/questions/1123060/how-do-you-drop-a-default-value-or-similar-constraint-in-t-sql

반응형