2011-09-19 62 views
2

我正在做一些測試數據與SSIS加載到我們的數據倉庫,並遇到了舊的栗子的外鍵約束。我將在本地測試環境中刪除/添加查找數據問題的所有數據。因此,我並不十分關心在這一點上的引用完整性......我遇到了這個方便的小查詢:刪除並重新創建所有約束結合sp_MSForEachTable sql服務器

-- 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 

唯一的問題是它是無用的,如果你有外鍵約束,你必須真正刪除它們。有沒有什麼辦法將這個查詢與將刪除/重新創建所有約束的東西結合起來?

+1

的可能重複(http://stackoverflow.com/questions/159038/can-foreign-key -constraints-be-temporarily-disabled-using-t-sql) – 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 

或者,腳本和首次下降的制約,加上tjem回來。
爲此,請參閱本文以"Script out your foreign keys"

+0

對於一個小數據庫無關緊要的使用DELETE,這樣就可以工作......感謝您的幫助! – jhowe

2

如果將啓用約束與ALTER TABLE ? CHECK CONSTRAINT ALL你會得到不可信的約束。請閱讀由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