是否有可能引用视图的字段以确保完整性?
伪代码示例:
CREATE VIEW V_ONE AS SELECT .....
CREATE TABLE TWO ( ID INT REFERENCES V_ONE ( field ))
我不希望CREATE TABLE T_ONE
而不是V_ONE
首先能够引用T_ONE
。
@edit:
查看V_ONE
从erp系统的多个表中收集数据并预处理它们。表格TWO
扩展了V_ONE
一些其他数据,这些数据不应包含在V_ONE
中。对于TWO
中的每个条目,表V_ONE
中都不能有条目,但我想确保表TWO
中没有条目可以在V_ONE
中找不到基础数据{1}}。
答案 0 :(得分:5)
简答:不。 Sql Server不允许在视图上使用外键。
您可以将外键约束放在视图中引用的“其中一个表”上,但没有上下文......很难给出方便的答案。
编辑:那么,关于v_one的查询,两个check constraint怎么办?
但是你必须找到一种方法来管理v_one的“源表”上的删除(和更新)。
您可以在视图(V_ONE)上使用(未经测试)INSTEAD OF DELETE(以及INSTEAD OF UPDATE(如果需要){{3}}触发器,并在表格(TWO)上使用检查约束。
答案 1 :(得分:0)
您可以使用检查约束而不是外键来实现类似的结果:
-- CREATE VIEW THAT RETURNS DUMMY DATA
CREATE VIEW V_ONE
AS
SELECT Field
FROM (VALUES (1), (2), (3)) T (Field);
GO
-- CREATE FUNCTION THAT VALIDATES CRITERIA
CREATE FUNCTION dbo.CheckFunction (@ID INT)
RETURNS BIT AS
BEGIN
IF EXISTS (SELECT 1 FROM V_ONE WHERE Field = @ID)
BEGIN
RETURN 1;
END
RETURN 0;
END
GO
-- CREATE TABLE THAT REFERENCES VIEW
CREATE TABLE T_TWO (ID INT NOT NULL CONSTRAINT CHK_T_TWO_ID CHECK (dbo.CheckFunction(ID) = 1));
-- TRY INSERTING A VALUE NOT RETURNED BY V_ONE
INSERT T_TWO VALUES (4);
您可能需要实现触发器来处理对V_One源的删除/更新,您可能也应该向源添加外键。