Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 删除触发器以替换“触发器”;“关于删除级联”;避免";“多个级联路径”;?_Sql Server_Triggers_Referential Integrity - Fatal编程技术网

Sql server 删除触发器以替换“触发器”;“关于删除级联”;避免";“多个级联路径”;?

Sql server 删除触发器以替换“触发器”;“关于删除级联”;避免";“多个级联路径”;?,sql-server,triggers,referential-integrity,Sql Server,Triggers,Referential Integrity,下表定义: CREATE TABLE Customers( id INT NOT NULL PRIMARY KEY, name [varchar](50) ) CREATE TABLE Orders ( id INT NOT NULL PRIMARY KEY, customer INT FOREIGN KEY REFERENCES Customers(id) ON DELE

下表定义:

   CREATE TABLE Customers( id INT NOT NULL PRIMARY KEY, name [varchar](50) )

    CREATE TABLE Orders ( id INT NOT NULL PRIMARY KEY, 
                          customer INT FOREIGN KEY 
                          REFERENCES Customers(id) ON DELETE CASCADE )

    CREATE TABLE OrderDetails ( id INT NOT NULL PRIMARY KEY, 
                                order INT FOREIGN KEY REFERENCES Orders(id) ON DELETE CASCADE, 
                                customer INT FOREIGN KEY REFERENCES Customers(id) ON DELETE CASCADE  )
在sql server中不可能,因为存在多个级联路径

我想让我们创建OrderDetails,而不使用列
order
上的DELETE CASCADE上的
,然后让我们看看在删除包含以下触发器的订单时是否可以强制引用完整性:

DELETE FROM OrderDetails
    FROM Deleted d
    INNER JOIN OrderDetails od
    ON od.order = d.id
触发器在delete in Orders之后触发,因此不可能触发(delete语句与引用约束冲突)

我认为问题在于模型设计,从OrderDetails到客户的参考是一个糟糕的设计。但是,如果不是这样,则可以为属于不同客户的订单创建OrderDetails

两个问题:

  • 什么是最好的模型设计
  • 是否仍然可以使用触发器
编辑:我删除了OrderDetails中对客户的引用,这没有任何意义。
这解决了所有问题。

我会通过根本不将客户放入OrderDetails来避免这个问题,因为它可以从加入订单中派生出来

即使使用外键,也不能阻止OrderDetails中的客户与Orders中的客户有所不同


此外,您真的希望对此进行级联删除吗?大概业务部门需要一些历史订单记录。

当然,在OrderDetails中包含CustomerId是不正确的,也没有意义。这会给您一种可传递的依赖关系。
此外,根据您的实际型号,如果任何订单与客户相关,则不应允许删除客户。您应该计划一个布尔值,或者是一个日期字段,如DeadCustomer:/

对于结构:
客户:Id、姓名等
订单:订单ID、订单日期、客户ID…
订单详细信息:订单ID、产品ID、数量、单价…

产品:产品ID、说明、状态、单价

你的回答有道理。然而,我没有试图删除一个客户,而是一个订单。我没有意识到“现状”的差异——我立即失去了对触发器的兴趣,改变了设计。