早上好,
我正在做很多工作来拖动一个数据库(SQL Server 2005,在2000兼容模式下),为了拥有理智的设计而踢腿和尖叫。
目前,所有表的主键都是nvarchar(32)
,并使用uniqId()
设置(奇怪的是,这会通过特殊的散列函数运行,不知道为什么)
所以在几个阶段,我正在做一些根本性的改变:
此阶段到目前为止运行良好,测试数据库似乎更快一点,每个表的总索引大小都要小得多。
我的问题是下一阶段:外键。我需要能够在其他表中的insert上设置这些INT
个外键。
有几个应用程序指向此DB,其中只有一个我可以控制。它还包含许多存储过程和触发器。
我无法一次性完成所需的所有更改。
所以我希望能够做的是将整数FK添加到每个表中并让它们在插入时自动设置为正确的东西。
用一个例子来说明这一点:
两个表格Call
和POD
,链接pod.Call_ID -> Call.Call_ID
。这是nvarchar(32)
字段。
我改变了调用,Call_ID_int
是身份,自动增量,主键。我需要添加POD.Call_ID_int
,以便在插入时从Call.Call_ID_int
获取正确的值。
我确信我可以通过BEFORE触发器执行此操作,但出于维护和速度原因,我宁愿避免这种情况。
我认为我可以通过约束来做到这一点,但经过大量研究发现我做不到。我试过这个:
alter table POD
add constraint
pf_callIdInt
default([dbo].[map_Call_ID_int](Call_ID))
for Call_ID_int
map_Call_ID_int
函数占用Call_ID
并返回右Call_ID_int
,但我收到此错误:
在此上下文中不允许使用名称“Call_ID”。有效表达式 是常量,常量表达式和(在某些上下文中)变量。 不允许使用列名。
我是如何实现这一目标的?
非常感谢!
-OLi
答案 0 :(得分:2)
触发器是最简单的方法。
基于UDF的默认值也会出现奇怪的并发问题(就像你对CHECK约束一样)。
另一个技巧是使用视图隐藏架构更改但仍然使用触发器来拦截DML。因此,您的“旧”表不再仅作为“新”表的视图存在。写入“旧”表/视图实际上发生在新表上。