programing

TSQL의 열에 대한 기본 제약 조건 삭제

goodsources 2023. 7. 30. 17:45
반응형

TSQL의 열에 대한 기본 제약 조건 삭제

현재 활성 상태인 다음과 같은 열이 있는 테이블이 있습니다.

name NVARCHAR(128) NOT NULL DEFAULT ''

다음과 같이 열을 변경하여 무효화합니다.

ALTER TABLE  mytable ALTER COLUMN name NVARCHAR(128) NULL

그러나 'DF__mytable__datab_7'이라는 기본 제약 조건은표의 한 예에서 DE4B36'은 여전히 남아 있습니다.원작자가 제약 조건에 이름을 붙였다면 피할 수 있었을 것이라는 것을 알고 있습니다.이러한 테이블의 여러 인스턴스가 있지만 모든 테이블의 모든 제약 조건을 수동으로 삭제하지는 않습니다.이 테이블의 모든 인스턴스에 균일하게 적용할 수 있는 SQL Server의 열에서 이 기본 제약 조건을 삭제하는 가장 쉽고 우아한 방법은 무엇입니까?

편집

이것이 제가 사용하게 된 스크립트입니다.

DECLARE @table_id AS INT
DECLARE @name_column_id AS INT
DECLARE @sql nvarchar(255) 

-- Find table id
SET @table_id = OBJECT_ID('mytable')

-- Find name column id
SELECT @name_column_id = column_id
FROM sys.columns
WHERE object_id = @table_id
AND name = 'name'

-- Remove default constraint from name column
SELECT @sql = 'ALTER TABLE mytable DROP CONSTRAINT ' + D.name
FROM sys.default_constraints AS D
WHERE D.parent_object_id = @table_id
AND D.parent_column_id = @name_column_id
EXECUTE sp_executesql @sql

이 작업을 수행하는 데 사용할 수 있는 다른 스크립트는 다음과 같습니다.SQL 기본 제약 조건을 이름도 모른 채 삭제하는 방법은 무엇입니까?

감사합니다!

다음은 제약 조건을 삭제하는 방법입니다.

ALTER TABLE <schema_name, sysname, dbo>.<table_name, sysname, table_name>
   DROP CONSTRAINT <default_constraint_name, sysname, default_constraint_name>
GO

스크립트 포함

-- t-sql scriptlet to drop all constraints on a table
DECLARE @database nvarchar(50)
DECLARE @table nvarchar(50)

set @database = 'dotnetnuke'
set @table = 'tabs'

DECLARE @sql nvarchar(255)
WHILE EXISTS(select * from INFORMATION_SCHEMA.TABLE_CONSTRAINTS where constraint_catalog = @database and table_name = @table)
BEGIN
    select    @sql = 'ALTER TABLE ' + @table + ' DROP CONSTRAINT ' + CONSTRAINT_NAME 
    from    INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
    where    constraint_catalog = @database and 
            table_name = @table
    exec    sp_executesql @sql
END

크레딧은 존 갤러웨이 http://weblogs.asp.net/jgalloway/archive/2006/04/12/442616.aspx 에 전달됩니다.

다음을 제안합니다.

DECLARE @sqlStatement nvarchar(MAX),
        @tableName nvarchar(50) = 'TripEvent',
        @columnName nvarchar(50) = 'CreatedDate';

SELECT                  
    @sqlStatement = 'ALTER TABLE ' + @tableName + ' DROP CONSTRAINT ' + dc.name + ';'
FROM            
    sys.default_constraints AS dc
LEFT JOIN   
    sys.columns AS sc ON (dc.parent_column_id = sc.column_id)
WHERE 
    dc.parent_object_id = OBJECT_ID(@tableName)
    AND type_desc = 'DEFAULT_CONSTRAINT'
    AND sc.name = @columnName

PRINT'   ['+@tableName+']:'+@@SERVERNAME+'.'+DB_NAME()+'@'+CONVERT(VarChar, GETDATE(), 127)+';  '+@sqlStatement;

IF (LEN(@sqlStatement) > 0)
     EXEC sp_executesql @sqlStatement

저는 이전 질문을 참고하고 싶습니다. 왜냐하면 저는 같은 문제에 직면했고 이 해결책으로 해결했기 때문입니다.무엇보다도 제약 조건은 항상 다음과 같이 구성됩니다.Hash그것의 이름에 가치가 있습니다.그래서 문제는 이것입니다.HASH는 시스템 또는 데이터베이스에 따라 다릅니다.예를들면DF__Companies__IsGlo__6AB17FE4여기서6AB17FE4는 해시 값(8비트)입니다.그래서 저는 모든 사람들에게 유익한 단일 대본을 언급하고 있습니다.

DECLARE @Command NVARCHAR(MAX)
     declare @table_name nvarchar(256)
     declare @col_name nvarchar(256)
     set @table_name = N'ProcedureAlerts'
     set @col_name = N'EmailSent'

     select @Command ='Alter Table dbo.ProcedureAlerts Drop Constraint [' + ( select 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) + ']'

    --print @Command
    exec sp_executesql @Command

기본 제약 조건이 삭제됩니다.하지만 다시 만들고 싶다면 이것을 시도해 보세요.

ALTER TABLE [dbo].[ProcedureAlerts] ADD DEFAULT((0)) FOR [EmailSent]

마지막으로, 간단히 실행합니다.DROP명령을 사용하여 열을 삭제합니다.

테이블 이름과 컬럼 이름만 필요하고 성공 여부와 실패 여부를 명확하게 표시하고 필요한 경우 오류가 발생하므로 이 제안을 드리고 싶습니다.

-- Removed unnamed default constraint from column if it exists.
-- If the default constraint doesn't exist, no error is raised

DECLARE @tablename AS varchar(128) = 'optional_schema.your_table'
DECLARE @columnname AS varchar(128) = 'your_column'
DECLARE @sql nvarchar(255) = NULL

select @sql = 'ALTER TABLE ' + t.name + ' DROP CONSTRAINT ' + d.name + ';'
FROM sys.columns AS c
INNER JOIN sys.tables t on c.object_id = t.object_id AND t.object_id = OBJECT_ID(@tablename) 
INNER JOIN sys.default_constraints AS D ON c.default_object_id=d.object_id
WHERE c.default_object_id IS NOT NULL
AND c.name = @columnname

--SELECT isNull(@SQL, 'NOT DEFAULTED') AS [Statement] -- Only if you want to see the statement before it runs
IF (@SQL IS NULL) 
    PRINT ' Table ' + @tablename + ', column ' + @columnname + ' does not have a default constraint.'
ELSE
    BEGIN TRY
        EXECUTE sp_executesql @sql
        PRINT @sql + ' -- Successful'
    END TRY
    BEGIN CATCH
        PRINT @sql + ' -- Unsuccessful, Error: ' + ERROR_MESSAGE()
    END CATCH

언급URL : https://stackoverflow.com/questions/10777353/drop-default-constraint-on-a-column-in-tsql

반응형