SQL Server에서 DF 제약 조건을 계속 생성하는 이유는 무엇입니까?
SQL에서 업그레이드 및 백아웃 스크립트를 생성하려고 합니다.업그레이드 스크립트는 다음과 같은 열을 추가합니다.
IF NOT EXISTS (SELECT * FROM sys.columns WHERE Name = N'ColumnName'
AND object_id = OBJECT_ID(N'[dbo].[TableName]'))
ALTER TABLE TableName
ADD ColumnName bit NOT NULL DEFAULT(0)
백아웃 스크립트는 다음과 같이 열을 제거합니다.
IF EXISTS (SELECT * FROM sys.columns WHERE Name = N'ColumnName'
AND object_id = OBJECT_ID(N'[dbo].[TableName]'))
ALTER TABLE TableName
DROP COLUMN ColumnName
그러나 백아웃 스크립트는 다음 오류를 발생시킵니다.
Msg 5074, Level 16, State 1, Line 5
The object 'DF__TableName__ColumnName__1BF3D5BD' is dependent on column 'ColumnName'.
Msg 4922, Level 16, State 9, Line 5
ALTER TABLE DROP COLUMN ColumnName failed because one or more objects access this column.
제약 조건을 삭제하는 방법을 알고 있지만 제약 조건의 이름이 매번 변경됩니다(접미사가 변경됨).이 임의 이름의 제약 조건을 만드는 것을 중지하려면 SQL Server가 필요하거나 이름이 변경되므로 와일드카드 문자를 사용하여 스크립트에서 제약 조건을 제거할 수 있어야 합니다.
여기가 바로default
때문에 추가되는 제약 조건DEFAULT(0)
새로 추가한 열에 있습니다.
자동 이름 생성에 의존하지 않고 알려진 고정 이름을 갖도록 이름을 직접 지정할 수 있습니다.
ALTER TABLE TableName
ADD ColumnName bit NOT NULL CONSTRAINT DF_Some_Fixed_Name DEFAULT(0)
그런 다음 열과 구속조건을 함께 제거하는 방법
ALTER TABLE dbo.TableName
DROP CONSTRAINT DF_Some_Fixed_Name, COLUMN ColumnName
실행:
declare @name as nvarchar(255);
SELECT @name = name FROM dbo.sysobjects
WHERE name LIKE 'DF__XXX__YYY__%' and type = 'D'
IF @name IS NOT NULL BEGIN
EXEC('ALTER TABLE XXX DROP CONSTRAINT ' + @name);
END
제약 조건을 제거하려면 다음을 실행합니다.
DECLARE @tableName NVARCHAR(255) = '[INSERT]';
DECLARE @first5CharsFromColumnName NVARCHAR(255) = '[INSERT]';
DECLARE @name NVARCHAR(255);
SELECT @name = d.name FROM dbo.sysobjects d
INNER JOIN dbo.sysobjects t ON t.id = d.parent_obj
WHERE d.name LIKE '%'+@first5CharsFromColumnName+'%' AND d.type = 'D' AND t.name = @tableName
IF @name IS NOT NULL BEGIN
EXEC('ALTER TABLE '+@tableName+' DROP CONSTRAINT ' + @name);
END
언급URL : https://stackoverflow.com/questions/7663390/why-does-sql-server-keep-creating-a-df-constraint
'programing' 카테고리의 다른 글
스프링 예약 작업과 스프링 배치 작업의 차이점은 무엇입니까? (0) | 2023.07.03 |
---|---|
TypeScript에서 형식 속성을 재정의하는 방법 (0) | 2023.07.03 |
선택 항목 내 SQL 사용자 정의 함수 (0) | 2023.07.03 |
오류: 모듈 파일의 최소 배포 대상은 ios8.3 v8.3입니다. (0) | 2023.07.03 |
SQL Server의 "IN" 절 제한 (0) | 2023.07.03 |