İki tabloya, Satış ve Ürünüm var. Satışı Ürüne gönderme yapan bir yabancı anahtar kısıtlaması vardır. Yabancı anahtar, oluşturulduktan sonra WITH NOCHECK
oluşturuldu ve hemen devre dışı bırakıldı. Yabancı anahtar kısıtını etkinleştirmek ve güvenmek istiyorum. Etkinleştiriliyor, ancak güvenilir olmasına izin veremiyorum. StackOverflow'daki ve çeşitli bloglardaYabancı anahtar kısıtlamaları nasıl güvenilir yapılır?
Benzer sorular ALTER TABLE T WITH CHECK CHECK CONSTRAINT C
çalışan is_disabled=0
ve is_not_trusted=0
neden gerektiğini belirtmek fakat is_not_trusted
benim için her zaman 1'dir. Neyi yanlış yapıyorum?
-- "_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.
Louie, testleri yapmak için zaman ayırdığınız için teşekkür ederim, bu harika bir cevap, keşke size birden fazla destek verebilseydim :) Güvenilirliği kısıtlamaya çalışıyorum çünkü güvenilmez olanları okudum bazı sorguların performansını etkileyebilir. Veritabanını devraldım ve çoğaltmıyoruz ama her şey "spekülatif genellik" durumunda olabilecek "DEĞİŞTİRME İÇİN DEĞİL" gibi görünüyor. – WileCau
@WileCau FK'lerin güvenilir olarak işaretlenmediği durumlarda, yürütme süresinde gerçekten bir iyileşme oluyorsunuz. Bu uygulamayı hiçbir şekilde teşvik etmiyorum. Bununla birlikte, büyük miktarda veriyi, aşamalı sql'den üretim sql'e taşımak çok yararlıdır. Daha fazla bilgi için buraya bakın http://sqlblog.com/blogs/hugo_kornelis/archive/2007/03/29/can-you-trust-your-constraints.aspx – harsimranb
@ Pathachiever11, haklısınız, kısıtlamaların devre dışı bırakılmasının nedeni çünkü bazı tablolar başlangıçta başka bir tutarlı veri tabanından dolduruldu, bu yüzden veri geçişini yavaşlattılar. İlk geçişten sonra, kısıtlamalar yeni veriler üzerinde tutarlılığı sağlamak için yeniden etkinleştirilmeli, ancak unutuldu. – WileCau