2014-01-20 32 views
0

我有一组表,我目前正试图为表设置正确的关系。浓缩版本如下。解决循环和多个级联路径

Users 
    ID INT NOT NULL 

Activities 
    ID INT NOT NULL 
    UserID INT NULL 

Logs 
    ID INT NOT NULL 
    UserID INT NULL 
    ActivityID INT NULL 

我有关系,从两个ActivitiesLogsUsers.IDActivityID与回Activities.IDUserID

我已经设置Activities.UserIDLogs.UserID在删除时设置为null,并在更新时级联。我的问题是,当我试图设置相同的更新和删除功能Logs.ActivityID,但我得到一个关于“可能导致周期或多个级联路径”的错误。我的问题是,Logs需要一个用户,并且不需要Activity,但Logs确实有一个Activity需要更新,如果Activity发生更改时。

我有什么办法,不涉及有两个单独的Logs表,并且不涉及手动更新Logs表。这在SQL Server 2012中甚至可能吗?

+0

为什么你需要这样做级联?我怀疑,删除一个用户是一个非常罕见的事件,你可以编写自己的删除逻辑,在删除用户之前手动删除(或设置NULL)值。 –

+1

如果我实际上不能使用它们,级联和设置为null会有什么意义?重点是,他们在那里被使用,我希望能够解决SQL服务器在几乎所有其他的SQL引擎上的缺点,而不必编写删除和空逻辑我自己 – bizzehdee

+0

很多东西存在考虑到最简单的实现编写的SQL Server,并且未针对更复杂的实现进行测试(因此不支持)。 FWIW,由于这个和其他原因,我从未在生产中使用CASCADE。如果在有多条路径的情况下让CASCADE自动工作对您来说很重要,那么请务必使用另一个数据库平台。当然,你会花更多的时间来转换你的模式和代码,而不是编写一个程序来为你做这件事...... –

回答

7

SQL Server不支持多个级联路径。解决此限制的选项有:

  1. 编写自己的逻辑以处理多个级联路径(推荐)。

  2. 更改您的模式,以便不需要多个级联路径。

  3. 等待SQL Server来解决这个问题。不要屏住呼吸 - 这是多年来的局限。查看这些连接项目:

    a。 http://connect.microsoft.com/SQLServer/feedback/details/126159/cascade-updates
    b。 http://connect.microsoft.com/SQLServer/feedback/details/307723/allow-multiple-cascade-paths-for-foreign-key-and-on-dalete-update-cascade

    请注意他们是怎么一直说“我们现在没有时间了,我们会考虑下一个版本”?这不是那种销售软件的东西,因为人们通常会对自己的逻辑编码感到满意。

  4. 迁移到支持多级联路径的数据库平台(听起来你觉得你有很多选择,但我不认为你这样做,我不知道你通过切换牺牲了什么,甚至没有计数移植你的模式和代码)。

+0

这是一个新项目,我完全可以切换到mysql或pgsql,特别是使用sql-server对SQL的有限掌握,我可以或多或少地编写我现在具有的表和数据的脚本,并在新引擎。这可能是我最终选择的选择。 – bizzehdee

+2

@bizzehdee太棒了,玩得开心!大多数人没有这种灵活性。希望稍后在这个项目中,你不会遇到使你想要切换回来的mysql或pgsql的限制。 –

+1

@bizzehdee这不是对“sql”的有限掌握。事实上,有许多逻辑理由不支持多级联路径,这就是为什么大多数rdbms会迫使任何认为这是一个好主意的开发人员自己做。当然,mysql和它的标准破解方式可能是您现在很好的选择,现在您会后悔的。这提出了一个很好的观点 - 想想你未来的自我,以及他们会为了这样一种“独特”的设计而憎恨你现在的自我。 – swasheck

相关问题