[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.미치 밀의 코드를 확장, 다음 스크립트는 제약 조건을 삭제하고 동적으로 실행할 명령을 생성합니다.
미치 밀의 코드를 확장, 다음 스크립트는 제약 조건을 삭제하고 동적으로 실행할 명령을 생성합니다.
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.롭 팔리의 블로그 게시물이 도움이 될 수 있습니다
롭 팔리의 블로그 게시물이 도움이 될 수 있습니다
뭔가 같은 :
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.나는이 작품과 사용이 더 조인 것을 발견 :
나는이 작품과 사용이 더 조인 것을 발견 :
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.여러 열에 대한 제약 조건을 삭제하려면 :
여러 열에 대한 제약 조건을 삭제하려면 :
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.확장 솔루션 (계정에 테이블 스키마 소요) :
확장 솔루션 (계정에 테이블 스키마 소요) :
-- 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.데이터베이스에 모든 기본 제약 조건을 드롭 - 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.모든 제약 조건을 찾아이 명령을 실행합니다 :
모든 제약 조건을 찾아이 명령을 실행합니다 :
exec sp_helpconstraint 'mytable' --and look under constraint_name.
그것은 다음과 같이 보일 것입니다 : DF__Mytable__Column를 __ [ABC123을]. 그럼 그냥 제약 조건을 드롭 할 수 있습니다.
-
==============================
8.나는이 비슷한 문제를 가지고 누구를 위해 도움이 될 수 있기를 바랍니다. ObjectExplorer 창에서 데이터베이스를 선택 => 테이블, => 테이블 => 제약. 고객이 열 시간을 만들에 정의되어있는 경우, 당신은 열 이름을 포함하여 제약 조건의 기본 이름을 볼 수 있습니다. 다음 사용 :
나는이 비슷한 문제를 가지고 누구를 위해 도움이 될 수 있기를 바랍니다. ObjectExplorer 창에서 데이터베이스를 선택 => 테이블, => 테이블 => 제약. 고객이 열 시간을 만들에 정의되어있는 경우, 당신은 열 이름을 포함하여 제약 조건의 기본 이름을 볼 수 있습니다. 다음 사용 :
ALTER TABLE yourTableName DROP CONSTRAINT DF__YourTa__NewCo__47127295;
(제한 조건 이름은 예입니다)
-
==============================
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.나는 다음과 같은 저장 프로 시저를 만들 수 있도록 여러 기본 제약, 생성 한 일부 열을했다 :
나는 다음과 같은 저장 프로 시저를 만들 수 있도록 여러 기본 제약, 생성 한 일부 열을했다 :
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.여러 기본 제약 조건 또는 점검 제한 조건이 작성했던 일부 열에 대한 유용한 :
여러 기본 제약 조건 또는 점검 제한 조건이 작성했던 일부 열에 대한 유용한 :
수정 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.
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.당신이 실행하기 전에 항상 스크립트 및 검토를 생성합니다. 스크립트 아래
당신이 실행하기 전에 항상 스크립트 및 검토를 생성합니다. 스크립트 아래
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.
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
from https://stackoverflow.com/questions/1430456/how-to-drop-sql-default-constraint-without-knowing-its-name by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SQLite는 데이터베이스 기본 시간 값 '지금' (0) | 2020.04.23 |
---|---|
[SQL] SQL Server Management Studio의 테이블 편집 후 변경 사항을 저장 (0) | 2020.04.23 |
[SQL] 는 SQL OVER () 절 - 언제, 왜 유용한가? (0) | 2020.04.22 |
[SQL] SQL을 사용하지 않고 젠토 설치 스크립트에서 ALTER 표 (0) | 2020.04.22 |
[SQL] MySQL의 : 잠금 테이블 대 거래 (0) | 2020.04.22 |