2011-09-19 4 views
2

SSIS를 사용하여 데이터웨어 하우스에로드 할 테스트 데이터를 일부 작성하고 이전 외래 키 제약 조건을 경험했습니다. 로컬 테스트 환경에서 데이터 문제를 찾는 모든 데이터를 제거/추가 할 것입니다. 그러므로 나는이 시점에서 참조 무결성에 대해 덜 신경 수 ... 나는이 쉽고 간단한 쿼리 건너 온 :모든 제약 조건을 삭제하고 다시 작성하십시오. sp_MSForEachTable과 결합하십시오. SQL Server

-- disable referential integrity 
EXEC sp_MSForEachTable 'ALTER TABLE ? NO CHECK CONSTRAINT ALL' 
GO 

EXEC sp_MSForEachTable 'TRUNCATE TABLE ?' 
GO 

-- enable referential integrity again 
EXEC sp_MSForEachTable 'ALTER TABLE ? CHECK CONSTRAINT ALL' 
GO 

유일한 문제는 당신이 실제로 드롭해야 당신이 외래 키 제약 조건이있는 경우는 쓸모입니다. 이 쿼리를 Drop/Recession 모든 제약 조건과 결합하는 방법이 있습니까 ???

+1

의 중복 가능성 (http://stackoverflow.com/questions/159038/can-foreign-key -constraints-be-temporary-disabled-using-t-sql) 작은 db에 – weltraumpirat

답변

3

는 불행하게도

당신은 외래 키

-- disable referential integrity 
EXEC sp_MSForEachTable 'ALTER TABLE ? NO CHECK CONSTRAINT ALL' 
GO 
EXEC sp_MSForEachTable 'DELETE ?' 
GO 
-- enable referential integrity again 
EXEC sp_MSForEachTable 'ALTER TABLE ? CHECK CONSTRAINT ALL' 
GO 

또는 스크립트를 사용하여 테이블을 삭제하고 먼저 제약 조건을 DROP, 나중에 다시 tjem를 추가 할 필요가 없습니다. 당신은 당신이 신뢰할 수없는 제약을 얻을 것이다 ALTER TABLE ? CHECK CONSTRAINT ALL에 제약을 가능하게 할 것이다 경우이를 위해
"Script out your foreign keys"

+0

은 DELETE 사용에 문제가 없으므로 작동합니다 ... 도움을 주셔서 감사합니다! – jhowe

2

에이 문서를 참조하십시오. Tibor Karaszi SQL Server MVP (Non-trusted constraintsNon-trusted constraints and performance)가 작성한 기사를 읽으십시오. ALTER TABLE ? WITH CHECK CHECK CONSTRAINT ALL을 사용해보세요.

예 : [? 외래 키 제약 조건이 일시적으로 T-SQL 사용하지 않도록 설정할 수 있습니다]

CREATE TABLE Persoana 
(
    IdPersoana INT IDENTITY(1,1) PRIMARY KEY 
    ,Nume NVARCHAR(50) NOT NULL 
    ,Prenume NVARCHAR(50) NOT NULL 
    ,Varsta TINYINT NOT NULL 
    ,CONSTRAINT CK_Persoana_Nume CHECK (Nume <> '') 
    ,CONSTRAINT CK_Persoana_Prenume CHECK (Prenume <> '') 
    ,CONSTRAINT CK_Persoana_Varsta CHECK(Varsta >= 18) 
); 

INSERT dbo.Persoana 
VALUES ('A','AA',22); 

SELECT cc.name, cc.is_disabled, cc.is_not_trusted 
FROM sys.check_constraints cc 
WHERE cc.parent_object_id = OBJECT_ID('dbo.Persoana'); 

ALTER TABLE dbo.Persoana NOCHECK CONSTRAINT ALL; 
ALTER TABLE dbo.Persoana CHECK CONSTRAINT ALL; 

SELECT cc.name, cc.is_disabled, cc.is_not_trusted 
FROM sys.check_constraints cc 
WHERE cc.parent_object_id = OBJECT_ID('dbo.Persoana'); 

ALTER TABLE dbo.Persoana WITH CHECK CHECK CONSTRAINT ALL; 
SELECT cc.name, cc.is_disabled, cc.is_not_trusted 
FROM sys.check_constraints cc 
WHERE cc.parent_object_id = OBJECT_ID('dbo.Persoana'); 
6
--Drop and Recreate Foreign Key Constraints 

SET NOCOUNT ON 

DECLARE @table TABLE(
    RowId INT PRIMARY KEY IDENTITY(1, 1), 
    ForeignKeyConstraintName NVARCHAR(200), 
    ForeignKeyConstraintTableSchema NVARCHAR(200), 
    ForeignKeyConstraintTableName NVARCHAR(200), 
    ForeignKeyConstraintColumnName NVARCHAR(200), 
    PrimaryKeyConstraintName NVARCHAR(200), 
    PrimaryKeyConstraintTableSchema NVARCHAR(200), 
    PrimaryKeyConstraintTableName NVARCHAR(200), 
    PrimaryKeyConstraintColumnName NVARCHAR(200)  
) 

INSERT INTO @table(ForeignKeyConstraintName, ForeignKeyConstraintTableSchema, ForeignKeyConstraintTableName, ForeignKeyConstraintColumnName) 
SELECT 
    U.CONSTRAINT_NAME, 
    U.TABLE_SCHEMA, 
    U.TABLE_NAME, 
    U.COLUMN_NAME 
FROM 
    INFORMATION_SCHEMA.KEY_COLUMN_USAGE U 
     INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS C 
     ON U.CONSTRAINT_NAME = C.CONSTRAINT_NAME 
WHERE 
    C.CONSTRAINT_TYPE = 'FOREIGN KEY' 

UPDATE @table SET 
    PrimaryKeyConstraintName = UNIQUE_CONSTRAINT_NAME 
FROM 
    @table T 
     INNER JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS R 
     ON T.ForeignKeyConstraintName = R.CONSTRAINT_NAME 

UPDATE @table SET 
    PrimaryKeyConstraintTableSchema = TABLE_SCHEMA, 
    PrimaryKeyConstraintTableName = TABLE_NAME 
FROM @table T 
    INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS C 
     ON T.PrimaryKeyConstraintName = C.CONSTRAINT_NAME 

UPDATE @table SET 
    PrimaryKeyConstraintColumnName = COLUMN_NAME 
FROM @table T 
    INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE U 
     ON T.PrimaryKeyConstraintName = U.CONSTRAINT_NAME 

--SELECT * FROM @table 

--DROP CONSTRAINT: 
SELECT 
    ' 
    ALTER TABLE [' + ForeignKeyConstraintTableSchema + '].[' + ForeignKeyConstraintTableName + '] 
    DROP CONSTRAINT ' + ForeignKeyConstraintName + ' 

    GO' 
FROM 
    @table 

--ADD CONSTRAINT: 
SELECT 
    ' 
    ALTER TABLE [' + ForeignKeyConstraintTableSchema + '].[' + ForeignKeyConstraintTableName + '] 
    ADD CONSTRAINT ' + ForeignKeyConstraintName + ' FOREIGN KEY(' + ForeignKeyConstraintColumnName + ') REFERENCES [' + PrimaryKeyConstraintTableSchema + '].[' + PrimaryKeyConstraintTableName + '](' + PrimaryKeyConstraintColumnName + ') 

    GO' 
FROM 
    @table 

GO 
관련 문제