需要帮助来编写触发器

时间:2011-02-12 13:24:59

标签: tsql triggers

我有三张桌子:

订单: orderid, valuedid, valuesdesc

客户: customerid, cutomdesc

组: groupid, groupdesc

valueid - 客户或群组的ID

valuesdesc - 必须填写适用于valueidCustomers的插入Groups说明,具体取决于在客户端中选择的用户(客户或群组)。

因此,当客户端发送Orders的插入查询时,它包含orderid新订单和valuedid。在客户端,我知道用户选择了什么:组或客户。

我需要的是:如果Orders中插入了新行,则valuesdesc列中插入的客户或群组的valuedid对应valuesdesc

我有一个想法是插入新订单记录valuesdesc,其中包含键 - 假值以选择正确的词典(客户或群组),但是如何创建该触发器我很遗憾现在还不知道

1 个答案:

答案 0 :(得分:2)

首先,我必须说这是一个非常罕见的设计。当您将记录插入Orders时,可以使用valuesdesc来提示valueid引用的表。但是只要valuesdesc被触发器填满,valueid就会失去任何意义。也就是说,您没有透露任何其他方式来引用CustomersGroups的引用。所以,您也可以完全删除valueid并使用valuesdesc传递“字典”提示和该表中的引用。

除此之外,因为valueid可以引用多个表,所以不能对其使用foreign key约束。

无论如何,在你目前的设计中你可以试试这个:

CREATE TRIGGER Orders_UpdateValuesdesc
ON Orders
FOR INSERT
AS
UPDATE o
SET valuesdesc = COALESCE(c.customdesc, g.groupdesc)
FROM Orders o
  INNER JOIN inserted ON o.orderid = i.orderid
  LEFT JOIN Customers c ON i.valuesdesc = 'Customers'
    AND i.valueid = c.customerid
  LEFT JOIN Groups g ON i.valuesdesc = 'Groups'
    AND i.valueid = g.customerid

字符串'Customers''Groups'表示字典说明符。您可以用实际值替换它们。

触发器使用LEFT JOIN加入CustomersGroups,然后使用Orders.valuesdesccustomdesc填充groupdesc,具体取决于哪个不是{{1}}空。