2016-04-07 29 views
1

Şu anki konumumda en az TLC ayırması gereken bir veritabanına rastladım, hepsi aynı olan birçok çapraz başvuru tablosu var Yapı şeması bilge ve tüm iş mantığını veya etki alanı bütünlüğünü zorlamak için tetikleyicileri kullanır. Bazı tetikleyicileri kısıtlamalarla değiştirip değiştiremeyeceğimi anlamaya çalışıyorum. Aşağıda bu kalıbı karşılayan tipik bir tablo tanımı verilmiştir. Hepsi aynı tetikleyici tabanlı çözümü kullanarak bu tabloların yaklaşık 400'ü vardır.Tetikleyiciler kullanmadan 1'den çoğa ilişki için ek bir kısıtlama nasıl oluşturulur

CREATE TABLE dbo.FooXRef 
(
FooXRefID INT NOT NULL IDENTITY(1,1) PRIMARY KEY, 
BarID INT NOT NULL CONSTRAINT [fk_Bar] FOREIGN KEY REFERENCES dbo.Bar(BarID), 
DefaultRecord BIT NOT NULL CONSTRAINT [DF_FooXRef_Default] DEFAULT(1) 
); 

orada BarID ve DefaultRecord = 0 aynı değere sahip kayıtların sonsuz sayıda var olabilir, ama BarID masa ve DefaultRecord = 1 yılında yerini sadece tek bir kayıt var olabilir olmanın kuralı.

Bu birleşime izin vermek için ne tür kısıtlamalar yapmam gerekiyor?

Bu tabloyu oluşturmak ve tetiklemek, geçerli veritabanında 400, sonraki adımda ise binlerce kişiyi üstleniyorum. Bu dava için işe yarayacak bir kısıtlama kurmak mümkün değil mi?

+0

Maalesef, örneğe bağlı olarak, bu programsal bakımdan devam etmelisiniz. –

+0

Örnek [burada] (https://technet.microsoft.com/en-us/library/ms188258%28v=sql.105%29.aspx) size herhangi bir fikir veriyor mu? – HABO

cevap

2

Tetik kullanmadan olası bir model.

WHERE ([DefaultRecord]=(1)) filtre koşuluyla (BarID, DefaultRecord) numaralı filtrelenmiş benzersiz bir dizin oluşturun.

Bu tür bir dizin ile, DefaultRecord = 1 numaralı BarID için yalnızca bir satır ekleyebilirsiniz.

DefaultRecord = 1 olan sıfır sayıda satıra sahip olmak mümkündür.

DefaultRecord = 0 olan herhangi bir sayıda satır olması mümkündür.

CREATE UNIQUE NONCLUSTERED INDEX [IX_DefaultRecord] ON [dbo].[FooXRef] 
(
    [BarID] ASC, 
    [DefaultRecord] ASC 
) 
WHERE ([DefaultRecord]=(1)) 
+0

Evet Varsayılan kayıt = 1 olan 0 satıra sahip olmak mümkündür. Evet, varsayılan kaydın = 0 olduğu herhangi bir sayıda satırın olması da mümkündür. Önerinizi uygulamaya çalışacağım ve nereden aldığımı göreceğim. – SSISPissesMeOff

+0

bir çekicilik gibi çalıştı. çok teşekkür ederim. Çek kısıtlaması yerine benzersiz bir endeks bile düşünmedim. – SSISPissesMeOff

+0

Bir şey değil. Bu cevabı faydalı bulmana sevindim. Sorunun başlığını düzenledim ve daha açıklayıcı hale getirmeye çalıştım. –