是否可以建立从用户表到系统 table 视图的关系?为了给出上下文,我希望我的一个表中的列的值被限制在我的另一个表的列名中,这似乎是最容易做到的通过浏览包含第二个表的列名的系统视图。
因此,使用经典示例,如果我有一个Customers表(FirstName LastName),我想创建另一个具有“customerAttribute”列的表,该列只能是“FirstName”或“LastName”。为了保持这种动态,如果“customerAttribute”列实际上是系统视图中存储Customer表中列的名称的外键,那将是很好的。这样,在实际的Customers表中添加,删除和重命名列时,我不必担心数据完整性问题。
我没有看到在SQL Server中创建这种关系的简单方法,所以我想知道是否搞乱/创建与系统表和/或视图的关系是一个主要的禁忌。
谢谢!
P.S。我问这个问题是为了帮助我解决another problem我在SO上发布的问题。
编辑:即使你不能直接建立与系统视图的关系,也许你可以创建一个视图,将查询返回到系统视图(获取列名),然后建立与该视图的关系......我现在就试试。
答案 0 :(得分:2)
显然没有什么可以阻止您创建引用系统表列的用户表列。所以明显的答案是肯定的。要回答您的真实问题,有必要提出一个不同的问题,即:将元数据存储在用户表中是个好主意吗?
如果我从数据管理纯粹主义者的角度回答,我会说这几乎总是一个坏主意。然而,作为一个实际问题,我已经做到了,尽管我并不以此为荣。通过混合数据和元数据可以获得一些结果,这些结果几乎是不可能实现的,而不会混合它们。
您运行的风险是,最终您将最终得到一个数据库,该数据库无法根据对主题专家有意义的属性进行记录。换句话说,您的数据库只能由您自己和您的同伴使用。有时这是一个可接受的风险。有时它不是。
答案 1 :(得分:1)
依赖于系统表总是一个坏主意,因为MS可以在没有警告的情况下更改它们。为什么不使用information schema views,它们是可移植的并支持需要查询元数据的应用程序?
答案 2 :(得分:0)
我不确定它是否有可能,但如果是,那么你肯定会走上危险的地方......你将如何重命名一个专栏?你会如何移动一列?你会如何删除列?这种类型的东西可能会在SSMS内部破坏很多。使用触发器或代码逻辑可以更好地处理这类事情。