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
'programing' 카테고리의 다른 글
Powershell에서 OS 버전, Linux 및 Windows 확인 (0) | 2023.08.04 |
---|---|
ASP 사용 방법.서버 제어 특성의 NET <%= 태그? (0) | 2023.08.04 |
UIImageView에서 이미지에 맞는 가로 세로 맞춤을 적용한 후 이미지 크기를 확인하는 방법 (0) | 2023.07.30 |
코틀린과 새로운 활동테스트 규칙: @Rule은 공개 규칙이어야 합니다. (0) | 2023.07.30 |
주입 및 리소스 및 자동 배선 주석 (0) | 2023.07.30 |