在插入时设置正确的外键

时间:2011-12-09 11:16:41

标签: sql-server-2005

早上好,

我正在做很多工作来拖动一个数据库(SQL Server 2005,在2000兼容模式下),为了拥有理智的设计而踢腿和尖叫。

目前,所有表的主键都是nvarchar(32),并使用uniqId()设置(奇怪的是,这会通过特殊的散列函数运行,不知道为什么)

所以在几个阶段,我正在做一些根本性的改变:

  1. 向每个表引入ID_int列,自动增量和主键
  2. 添加一些额外的索引,删除未使用的索引,删除未使用的列
  3. 此阶段到目前为止运行良好,测试数据库似乎更快一点,每个表的总索引大小都要小得多。

    我的问题是下一阶段:外键。我需要能够在其他表中的insert上设置这些INT个外键。

    有几个应用程序指向此DB,其中只有一个我可以控制。它还包含许多存储过程和触发器。

    我无法一次性完成所需的所有更改。

    所以我希望能够做的是将整数FK添加到每个表中并让它们在插入时自动设置为正确的东西。

    用一个例子来说明这一点:

    两个表格CallPOD,链接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

1 个答案:

答案 0 :(得分:2)

触发器是最简单的方法。

基于UDF的默认值也会出现奇怪的并发问题(就像你对CHECK约束一样)。

另一个技巧是使用视图隐藏架构更改但仍然使用触发器来拦截DML。因此,您的“旧”表不再仅作为“新”表的视图存在。写入“旧”表/视图实际上发生在新表上。