제약 조건을 일시적으로 해제 (MS SQL)
모든 DB 제약 조건 (예 : 테이블 관계)을 일시적으로 해제하는 방법을 찾고 있습니다.
하나의 DB 테이블을 다른 DB에 복사 (INSERT 사용)해야합니다. 적절한 순서로 명령을 실행하여 (관계를 깨지 않도록) 달성 할 수 있다는 것을 알고 있습니다.
그러나 검사 제약 조건을 일시적으로 해제하고 작업 완료 후 다시 설정하면 더 쉬울 것입니다.
이것이 가능한가?
SQL 2005+에서만
FK 및 CHECK 제약 조건을 비활성화 할 수 있습니다
. ALTER TABLE 참조
ALTER TABLE foo NOCHECK CONSTRAINT ALL
또는
ALTER TABLE foo NOCHECK CONSTRAINT CK_foo_column
기본 키와 고유 제약 조건은 비활성화 할 수 없지만 올바르게 이해하면 괜찮습니다.
-- Disable the constraints on a table called tableName:
ALTER TABLE tableName NOCHECK CONSTRAINT ALL
-- Re-enable the constraints on a table called tableName:
ALTER TABLE tableName WITH CHECK CHECK CONSTRAINT ALL
---------------------------------------------------------
-- Disable constraints for all tables:
EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT all'
-- Re-enable constraints for all tables:
EXEC sp_msforeachtable 'ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all'
---------------------------------------------------------
그리고 당신이 당신의 관계를 깨고 고아를 소개하지 않았 음을 확인하려면, 수표를 다시 준비한 후에, 즉
ALTER TABLE foo CHECK CONSTRAINT ALL
또는
ALTER TABLE foo CHECK CONSTRAINT FK_something
그런 다음 다시 실행하여 다음과 같이 선택한 열에 대해 업데이트를 수행 할 수 있습니다.
UPDATE myUpdatedTable SET someCol = someCol, fkCol = fkCol, etc = etc
그리고 그 시점의 오류는 제약 조건을 충족하지 못하기 때문에 발생합니다.
실제로 단일 SQL 명령에서 모든 데이터베이스 제한 조건을 사용 불가능하게하고 다른 단일 명령을 호출하여 다시 사용할 수 있습니다. 보다:
나는 현재 SQL Server 2005와 함께 일하고 있지만이 방법이 SQL 2000에서도 작동한다는 것을 거의 확신합니다.
모든 외래 키 비활성화 및 활성화
CREATE PROCEDURE pr_Disable_Triggers_v2
@disable BIT = 1
AS
DECLARE @sql VARCHAR(500)
, @tableName VARCHAR(128)
, @tableSchema VARCHAR(128)
-- List of all tables
DECLARE triggerCursor CURSOR FOR
SELECT t.TABLE_NAME AS TableName
, t.TABLE_SCHEMA AS TableSchema
FROM INFORMATION_SCHEMA.TABLES t
ORDER BY t.TABLE_NAME, t.TABLE_SCHEMA
OPEN triggerCursor
FETCH NEXT FROM triggerCursor INTO @tableName, @tableSchema
WHILE ( @@FETCH_STATUS = 0 )
BEGIN
SET @sql = 'ALTER TABLE ' + @tableSchema + '.[' + @tableName + '] '
IF @disable = 1
SET @sql = @sql + ' DISABLE TRIGGER ALL'
ELSE
SET @sql = @sql + ' ENABLE TRIGGER ALL'
PRINT 'Executing Statement - ' + @sql
EXECUTE ( @sql )
FETCH NEXT FROM triggerCursor INTO @tableName, @tableSchema
END
CLOSE triggerCursor
DEALLOCATE triggerCursor
First, the foreignKeyCursor cursor is declared as the SELECT statement that gathers the list of foreign keys and their table names. Next, the cursor is opened and the initial FETCH statement is executed. This FETCH statement will read the first row's data into the local variables @foreignKeyName and @tableName. When looping through a cursor, you can check the @@FETCH_STATUS for a value of 0, which indicates that the fetch was successful. This means the loop will continue to move forward so it can get each successive foreign key from the rowset. @@FETCH_STATUS is available to all cursors on the connection. So if you are looping through multiple cursors, it is important to check the value of @@FETCH_STATUS in the statement immediately following the FETCH statement. @@FETCH_STATUS will reflect the status for the most recent FETCH operation on the connection. Valid values for @@FETCH_STATUS are:
0 = FETCH was successful
-1 = FETCH was unsuccessful
-2 = the row that was fetched is missingInside the loop, the code builds the ALTER TABLE command differently depending on whether the intention is to disable or enable the foreign key constraint (using the CHECK or NOCHECK keyword). The statement is then printed as a message so its progress can be observed and then the statement is executed. Finally, when all rows have been iterated through, the stored procedure closes and deallocates the cursor.
see Disabling Constraints and Triggers from MSDN Magazine
참고URL : https://stackoverflow.com/questions/737115/turn-off-constraints-temporarily-ms-sql
'IT story' 카테고리의 다른 글
파이썬에서 임의의 부울을 얻습니까? (0) | 2020.05.08 |
---|---|
offsetHeight, clientHeight, scrollHeight 란 무엇입니까? (0) | 2020.05.08 |
찾고있는 파일을 제공하는 rpm 패키지를 어떻게 찾습니까? (0) | 2020.05.08 |
jQuery를 사용하여 입력 필드 유형 변경 (0) | 2020.05.08 |
Angular 4 : 컴포넌트 팩토리를 찾을 수 없습니다. @ NgModule.entryComponents에 추가하셨습니까? (0) | 2020.05.08 |