복붙노트

[SQL] 어떻게 이름을 몰라도 SQL 기본 제약 조건을 삭제하려면?

SQL

어떻게 이름을 몰라도 SQL 기본 제약 조건을 삭제하려면?

마이크로 소프트 SQL 서버, 나는 기본 제약 조건은 컬럼에 존재하고 기본 제약 조건이 떨어질 경우 쿼리가 확인 알고 :

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 삭제',하지만 그것을 찾을 수없는 경우 오류를 제공하지 않습니다.

해결법

  1. ==============================

    1.미치 밀의 코드를 확장, 다음 스크립트는 제약 조건을 삭제하고 동적으로 실행할 명령을 생성합니다.

    미치 밀의 코드를 확장, 다음 스크립트는 제약 조건을 삭제하고 동적으로 실행할 명령을 생성합니다.

    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)
    
  2. ==============================

    2.롭 팔리의 블로그 게시물이 도움이 될 수 있습니다

    롭 팔리의 블로그 게시물이 도움이 될 수 있습니다

    뭔가 같은 :

     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
    
  3. ==============================

    3.나는이 작품과 사용이 더 조인 것을 발견 :

    나는이 작품과 사용이 더 조인 것을 발견 :

    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 쿼리가 정확히 일치를 찾고 있기 때문에 주위에 괄호가없는 아무것도 반환하지 않습니다 있는지 확인하십시오.

  4. ==============================

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

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

    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. ==============================

    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)
    
  6. ==============================

    6.데이터베이스에 모든 기본 제약 조건을 드롭 - NVARCHAR (최대) 임계 값에 대한 안전.

    데이터베이스에 모든 기본 제약 조건을 드롭 - NVARCHAR (최대) 임계 값에 대한 안전.

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

    7.모든 제약 조건을 찾아이 명령을 실행합니다 :

    모든 제약 조건을 찾아이 명령을 실행합니다 :

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

    그것은 다음과 같이 보일 것입니다 : DF__Mytable__Column를 __ [ABC123을]. 그럼 그냥 제약 조건을 드롭 할 수 있습니다.

  8. ==============================

    8.나는이 비슷한 문제를 가지고 누구를 위해 도움이 될 수 있기를 바랍니다. ObjectExplorer 창에서 데이터베이스를 선택 => 테이블, => 테이블 => 제약. 고객이 열 시간을 만들에 정의되어있는 경우, 당신은 열 이름을 포함하여 제약 조건의 기본 이름을 볼 수 있습니다. 다음 사용 :

    나는이 비슷한 문제를 가지고 누구를 위해 도움이 될 수 있기를 바랍니다. ObjectExplorer 창에서 데이터베이스를 선택 => 테이블, => 테이블 => 제약. 고객이 열 시간을 만들에 정의되어있는 경우, 당신은 열 이름을 포함하여 제약 조건의 기본 이름을 볼 수 있습니다. 다음 사용 :

    ALTER TABLE  yourTableName DROP CONSTRAINT DF__YourTa__NewCo__47127295;
    

    (제한 조건 이름은 예입니다)

  9. ==============================

    9.솔루션에 이어 테이블에서 컬럼의 특정 기본 제약 조건을 삭제합니다

    솔루션에 이어 테이블에서 컬럼의 특정 기본 제약 조건을 삭제합니다

    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)
    
  10. ==============================

    10.나는 다음과 같은 저장 프로 시저를 만들 수 있도록 여러 기본 제약, 생성 한 일부 열을했다 :

    나는 다음과 같은 저장 프로 시저를 만들 수 있도록 여러 기본 제약, 생성 한 일부 열을했다 :

    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
    
  11. ==============================

    11.여러 기본 제약 조건 또는 점검 제한 조건이 작성했던 일부 열에 대한 유용한 :

    여러 기본 제약 조건 또는 점검 제한 조건이 작성했던 일부 열에 대한 유용한 :

    수정 https://stackoverflow.com/a/16359095/206730 스크립트

    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
    
  12. ==============================

    12.

            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)
    
           **Take a look**
    
  13. ==============================

    13.당신이 실행하기 전에 항상 스크립트 및 검토를 생성합니다. 스크립트 아래

    당신이 실행하기 전에 항상 스크립트 및 검토를 생성합니다. 스크립트 아래

      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
    
  14. ==============================

    14.

    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
    
  15. from https://stackoverflow.com/questions/1430456/how-to-drop-sql-default-constraint-without-knowing-its-name by cc-by-sa and MIT license