【问题标题】:SQL Server 2005 foreign key cascadeSQL Server 2005 外键级联
【发布时间】:2013-02-28 04:00:03
【问题描述】:

我有一个表 ParentTable (id, Name, town) 及其子表 human (mother, father),其中两列都包含到父表的映射。

父表的列town 包含带有Town (townid, townname) 的外键引用,并且该城镇添加了外键引用。

现在的问题是我需要为人类表提供级联约束,但在 SQL Server 中,同一父表的多个列不能级联。所以我创建了这样的触发器,

create trigger DEL_Parent                                             
ON Parent  
instead of delete as      
   set nocount on       

   delete from human       
   where mother IN (select id from deleted)        
      or father IN (select id from deleted)

 delete from Parent where id in(select id from deleted). 

但是当我尝试执行触发器时,系统显示如下错误

不能创建代替删除或代替更新触发器 父表上的 DEL_Parent。这是因为该表有一个外国 具有级联删除或更新的键。

如何解决这个问题?提前致谢。

【问题讨论】:

    标签: sql-server-2005


    【解决方案1】:

    将查询修改为:

    create trigger DEL_Parent                                             
    ON Parent  
    after delete as      
      set nocount on       
    
      delete 
      from human       
      where mother IN (select id from deleted)        
         or father IN (select id from deleted)
    
      delete 
      from Parent 
      where id in(select id from deleted)
    

    因为INSTEAD OF DELETE 触发器不能在具有使用DELETE 操作定义的外键的表上定义。

    【讨论】:

      【解决方案2】:

      不能在具有使用 DELETE 操作定义的外键的表上定义 INSTEAD OF DELETE 触发器。

      来源:http://msdn.microsoft.com/en-us/library/ms191208(v=sql.90).aspx

      所以,我想如果你愿意的话,你必须放弃你的 cascade delete 并使用触发器来处理它,如果你仍然想强制执行它。

      【讨论】:

      • 实现的另一种可能性是什么?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-25
      • 2011-01-17
      • 1970-01-01
      • 1970-01-01
      • 2014-09-05
      • 1970-01-01
      • 2011-03-25
      相关资源
      最近更新 更多