关于视图的外键参考

时间:2013-01-14 12:56:26

标签: sql-server-2008 tsql

是否有可能引用视图的字段以确保完整性?

伪代码示例:

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}}。

2 个答案:

答案 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源的删除/更新,您可能也应该向源添加外键。