私は2つのテーブル、SaleとProductを持っています。 Saleには、Productを参照する外部キー制約があります。外部キーはWITH NOCHECK
で作成され、作成後すぐに無効になりました。私は、外部キー制約を有効にして信頼したいと思います。それを有効にすることはできますが、私はそれを信頼できるものにすることはできません。 StackOverflowの様々なブログ上外部キー制約を信頼できるようにする方法
同様の質問がALTER TABLE T WITH CHECK CHECK CONSTRAINT C
を実行するとis_disabled=0
とis_not_trusted=0
になる必要があることを示しますが、is_not_trusted
はいつも私のための1です。私は間違って何をしていますか?
私はSQLフィドルにサンプルコードを入れてみましたが、それはそうここにある、「DBCC」コマンドを好きではなかった:あなたの例に基づいて
-- "_Scratch" is just a sandbox DB that I use for testing stuff.
USE _Scratch
CREATE TABLE dbo.Product
(
ProductKeyId INT PRIMARY KEY NOT NULL,
Description VARCHAR(40) NOT NULL
)
CREATE TABLE dbo.Sale
(
ProductKeyId INT NOT NULL,
SaleTime DATETIME NOT NULL,
Value MONEY NOT NULL
)
ALTER TABLE dbo.Sale WITH NOCHECK
ADD CONSTRAINT FK_Product_ProductKeyId FOREIGN KEY (ProductKeyId)
REFERENCES dbo.Product (ProductKeyId) NOT FOR REPLICATION;
ALTER TABLE dbo.Sale NOCHECK CONSTRAINT FK_Product_ProductKeyId
INSERT INTO dbo.Product VALUES (1, 'Food')
INSERT INTO dbo.Sale VALUES (1, GETDATE(), 1.00)
-- Check the disabled/trusted state
SELECT name, is_disabled, is_not_trusted
FROM sys.foreign_keys
WHERE name = 'FK_Product_ProductKeyId'
-- name is_disabled is_not_trusted
-- FK_Product_ProductKeyId 1 1
-- Check the FK_Product_ProductKeyId constraint
DBCC CHECKCONSTRAINTS('FK_Product_ProductKeyId')
-- DBCC execution completed.
-- If DBCC printed error messages, contact your system administrator.
-- Check all constraints on Sale table
DBCC CHECKCONSTRAINTS('Sale')
-- DBCC execution completed.
-- If DBCC printed error messages, contact your system administrator.
-- Add the constraint and check existing data
ALTER TABLE Sale WITH CHECK CHECK CONSTRAINT FK_Product_ProductKeyId
-- Check the disabled/trusted state
SELECT name, is_disabled, is_not_trusted
FROM sys.foreign_keys
WHERE name = 'FK_Product_ProductKeyId'
-- name is_disabled is_not_trusted
-- FK_Product_ProductKeyId 0 1
-- Check the FK_Product_ProductKeyId constraint
DBCC CHECKCONSTRAINTS('FK_Product_ProductKeyId')
-- DBCC execution completed.
-- If DBCC printed error messages, contact your system administrator.
-- Check all constraints on Sale table
DBCC CHECKCONSTRAINTS('Sale')
-- DBCC execution completed.
-- If DBCC printed error messages, contact your system administrator.
ルーイ、テストをする時間を取ってくれてありがとう、それは素晴らしい答えです、私はあなたに複数のupvoteを与えることができたらいいと思っています:)私は、一部のクエリのパフォーマンスに影響を与える可能性があります。私はデータベースを継承し、複製はしませんが、すべてが "投機的ではない"と思われます。これは "投機的な一般性"のケースかもしれません。 – WileCau
@WileCau FKが信頼されていないとマークされている場合、実際には実行時間が改善されます。私はこの練習を励ますことは決してありません。しかし、大量のデータをステージングするsqlからプロダクションsqlに移動することは非常に便利です。詳細はこちらhttp://sqlblog.com/blogs/hugo_kornelis/archive/2007/03/29/can-you-trust-your-constraints.aspx – harsimranb
@ Pathachiever11、そうです、制約が無効になった理由いくつかのテーブルが最初に別の既知の一貫性のあるデータベースから移入されたので、データ移行が遅くなったからです。最初の移行後、制約は新しいデータに一貫性を持たせるために再び有効にされていたはずですが、それらは忘れてしまっていました。 – WileCau