我有一个SQL-Server2008数据库和一个使用外键约束来强制引用完整性的架构。按预期工作。现在,用户在原始表上创建视图以仅处理数据的子集。我的问题是,过滤某些表中的某些数据集而不过滤其他表中的某些数据集会违反外键约束。 想象两个表“一个”和“两个”。“一个”仅包含一个ID列,其值分别为1,2,3。“两个”引用“一个”。现在,您在两个表上都创建了视图。表“ two”的视图不过滤任何内容,而表“one”的视图则删除除第一行以外的所有行。您将最终在第二个视图中指向任何地方的条目。
有什么办法可以避免这种情况?您是否可以在视图之间使用外键约束?
*针对某些评论做出的 *一些澄清 : 我知道,即使在通过视图插入时,潜在的约束也将确保数据的完整性。我的问题在于语句消耗了视图。这些语句是在考虑原始表的前提下编写的,并假定某些联接不会失败。使用表时,此假设始终有效- 但视图可能会破坏它。 首先,由于大量的引用表,因此在创建视图时加入/检查所有约束是很麻烦的。因此,我希望避免这种情况。
Peter已经对此提出质疑,但是最好的解决方案是:
IE,
CREATE VIEW v1 AS SELECT * FROM table1 WHERE blah CREATE VIEW v2 AS SELECT * FROM table2 WHERE EXISTS (SELECT NULL FROM v1 WHERE v1.id = table2.FKtoTable1)
当然,将一个表上的视图的筛选器传播到从属表上的视图的语法糖很方便,但是可惜,它不是SQL标准的一部分。也就是说,此解决方案仍然足够好-高效,简单,可维护,并保证使用代码的理想状态。