2012-04-09 36 views
1

基於Constraint for only one record marked as default如果我想在表範圍內實現相同的結果,是否可以應用視圖和唯一聚簇索引的相同方法?在表範圍內具有特定值的約束列

我有一張名爲Accounts的表。只能有一個系統帳戶,但可能有許多合作伙伴和客戶帳戶。每種類型的帳戶都不會因列而有所不同,而只能使用「類型」列。

ID | Type | Name 
1 System Contoso 
2 Partner Wingtip 
3 Partner Northwind 
4 Client Adventure Works 
5 Client Fabrikam 

在上面我想阻止添加另一個系統帳戶,但允許許多合作伙伴和客戶帳戶。這感覺像屬於數據庫中的問題,而不是域(可能我錯了)?

回答

3

如果您知道系統帳戶將始終具有ID編號1,那麼可以使用CHECK約束來實現此功能。沿着這些線路的東西。 。 。

create table accounts (
    id integer primary key, 
    type varchar(15) not null, 
    name varchar(15) not null, 
    unique (type, name), 
    check (
    (id = 1 and type = 'System') or 
    (id <> 1 and type <> 'System') 
) 
); 

事實上,如果這是你的數據庫,系統帳戶可以有任何的ID號。只需更改CHECK()約束即可匹配。

如果您正在構建部署到客戶端站點,則可以在部署之前添加系統帳戶。 (無論您如何處理約束條件,您可能都應該這樣做)。

想想用戶嘗試從該表中刪除行時該怎麼做。 (尤其是系統帳戶行。)然後考慮數據庫管理員嘗試從該表中刪除行時該怎麼做。

您可能可以使用外鍵約束(無級聯)或觸發器來防止數據庫管理員意外刪除系統帳戶。管理員可能會繞過這些限制,但是如果她願意爲了刪除一行而做到這一點,她希望她知道自己在做什麼。

+0

你似乎涵蓋了我會提出的所有要點。 +1 – 2012-04-09 15:20:23

+0

良好的通話 - 我們實際上在添加系統帳戶之前,應用程序可以啓用常規使用。至於後臺數據插手這是另一個挑戰,但幸運的是對這個嚴格的訪問控制環境。 – 2012-04-09 17:27:41