IT story

제약 조건을 일시적으로 해제 (MS SQL)

hot-time 2020. 5. 8. 08:21
반응형

제약 조건을 일시적으로 해제 (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 missing

Inside 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

반응형