1

是否有一个自然的选择来建立表和视图之间的关系,或者我应该使用触发器作为一种解决方法来检查数据的一致性?

我有一个查找视图(出于某种原因,我需要它是视图而不是表格)。我想将记录插入到另一个表中。我要插入的记录的值之一必须是查找视图中的 id 之一。

例如:

ViewCities (CityId, CityName) -- 这是查找视图。位于不同数据库上的视图后面的表。现在我想向 tblUsers 插入新行。其中一个行列是 CityId。我希望没有人能够向 tblUsers 插入包含 ViewCities 上不存在的 cityid 的行。

4

1 回答 1

0

我知道您有两个选项可以保持参照完整性。您不能使用外键约束,因为您说这些表位于两个单独的数据库中。选项是: 1. 使用触发器,正如您所提到的。2. 使用一个检查约束,它引用一个用户定义的函数来进行检查。

例如:

假设我有一个名为 test 的数据库,另一个数据库是 Northwind 数据库。在我的测试数据库中,我想创建一个记录用户名的表。我要强制执行的检查是用户名必须是 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 LastName=@name)
    begin
        set @name_found=1
    end

return @name_found 
end

然后,我使用如下检查约束创建表:

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

现在,如果您尝试在 tst 表中插入一行,则它必须是 Northwind 数据库中员工表的姓氏之一。

于 2013-04-11T12:24:52.673 回答