1

是否有可能参考某个视野以确保完整性?

伪代码示例:

CREATE VIEW V_ONE AS SELECT .....
CREATE TABLE TWO ( ID INT REFERENCES V_ONE ( field ))

不想CREATE TABLE T_ONE不是V_ONE首先能够引用T_ONE.

@编辑:

ViewV_ONE从 erp 系统的多个表中收集数据并对其进行预处理。表TWO扩展V_ONE了一些额外的数据,这些数据不应该包含在V_ONE. TWO表中的每个条目都不能有一个条目V_ONE,但我想确保表中没有条目TWOV_ONE.

4

2 回答 2

5

简短的回答:没有。Sql Server 不允许在视图上使用外键。

您可以将外键约束放在视图中引用的“表之一”上,但没有上下文......很难给出方便的答案。

编辑:好吧,对两个检查约束怎么样,对 v_one 进行查询?

但是您必须找到一种方法来管理 v_one 的“源表”上的删除(和更新)。

您可以在视图 (V_ONE) 上使用(未经测试的) INSTEAD OF DELETE(如果需要,还可以使用INSTEAD OF UPDATE )触发器和表上的检查约束(TWO)。

于 2013-01-14T12:58:30.533 回答
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 源的删除/更新,您也应该向源添加一个外键。

于 2013-01-14T13:22:19.053 回答