2013-04-10 59 views
1

在表和視圖之間建立關係是否有自然選擇,或者我應該使用觸發器作爲解決方法來檢查數據一致性?使用Microsoft SQL的表和視圖之間的關係

我有一個查找視圖(出於某種原因,我需要它是查看,而不是表)。 我想將記錄插入到不同的表中。我想要插入的記錄的其中一個值必須是查找視圖中的一個ID。

例如:

ViewCities(CityId,CITYNAME) - 這是查找視圖。位於不同數據庫上的視圖後面的表格。 現在我想插入新行到tblUsers。行列之一是CityId。我希望沒有人能夠向tblUsers插入一行,其中包含ViewCities中不存在的cityid。

+0

桌子上的觀點是什麼?在這種情況下,你根本不需要檢查。 – muhmud 2013-04-10 08:54:55

+0

向我們展示一些數據庫模式,以便我們能夠理解您嘗試實現的目標。 – Tanner 2013-04-10 12:13:56

+0

從你用「外鍵關係」來標記問題的事實,我假設兩個表之間存在關係?我認爲沒有足夠的信息來回答你的問題。你可以發佈表/視圖的CREATE語句,並顯示關係應該是什麼? – 2013-04-10 12:14:10

回答

0

我有兩種選擇,我知道保持參照完整性。您不能使用外鍵約束,因爲您說這些表位於兩個單獨的數據庫中。選項如下: 1.如上所述,使用觸發器。 2.使用檢查約束,該約束引用執行檢查的用戶定義函數。

例如:

比方說,我有一個數據庫名爲test,而另一個數據庫是Northwind數據庫。在我的測試數據庫中,我想創建一個記錄用戶名的表。我想強制執行的檢查是,用戶名必須是羅斯文數據庫中用戶的姓氏之一。我首先創建像這樣一個UDF:

create function chk_name (@name varchar(50)) 
returns bit 
as 
begin 
declare @name_found bit=0 
if exists(select * from Northwind..Employees where [email protected]) 
    begin 
     set @name_found=1 
    end 

return @name_found 
end 

然後,我創建了表檢查約束,像這樣:

create table tst 
(name varchar(50) check (dbo.chk_name(name)=1 ) 
) 

現在,如果你嘗試插入一行到尖沙咀表中,必須是羅斯文數據庫中僱員表的最後一個名稱之一。

+0

順便說一下,您可以輕鬆地使用視圖,而不是用戶定義函數中的表格。 – 2013-04-11 12:35:39