Tsql 需要帮助来写触发器吗

Tsql 需要帮助来写触发器吗,tsql,triggers,Tsql,Triggers,我有三张桌子: 订单: orderid、valuedid、valuesdsc 顾客: customerid,cutomdesc 小组: groupid,groupdesc valueid-客户或组的id valuesdsc-必须填写valueid说明,说明来自客户或组,具体取决于用户在客户机中选择的(客户或组) 因此,当客户端发送一个针对Orders的插入查询时,它包括新订单的orderid和valuedid。在客户端,我知道用户选择了什么:组还是客户 我需要的是:如果在订单中插入了新行,则在v

我有三张桌子:

订单:
orderid、valuedid、valuesdsc

顾客:
customerid,cutomdesc

小组:
groupid,groupdesc

valueid
-客户或组的id

valuesdsc
-必须填写
valueid
说明,说明来自
客户
,具体取决于用户在客户机中选择的(客户或组)

因此,当客户端发送一个针对
Orders
的插入查询时,它包括新订单的
orderid
valuedid
。在客户端,我知道用户选择了什么:组还是客户

我需要的是:如果在
订单
中插入了新行,则在
valuesdsc
列中插入客户或组的
valuesdsc


我有一个想法,可以插入新的订单记录
valuesdsc
,其中包含键-假值以选择正确的字典(客户或组),但不幸的是,我现在不知道如何创建触发器。

首先,我必须说这是一个非常罕见的设计。将记录插入到
订单
中时,使用
valuesdsc
提示
valueid
引用的表。但是一旦触发器填充了
valuesdsc
valueid
基本上就失去了任何意义。也就是说,您没有向我们透露您有任何其他方法来区分对
客户的引用
和对
组的引用
。因此,您可以完全删除
valueid
,并使用
valuesdsc
传递“dictionary”提示和该表中的引用

除此之外,由于
valueid
可以引用多个表,因此不能对其使用约束

无论如何,在您目前的设计中,您可以尝试以下方法:

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'
表示字典说明符。将它们替换为实际值


触发器使用左联接来联接
客户
,然后用
customdesc
groupdesc
填充
订单。安德烈,据我所知,在我们得到valuedesc之后,valueid是多余的,因为它失去了引用和关键意义?这促使我有了正确的想法。约翰尼:是的,没错
valueid
在您知道哪个表是什么意思并且需要另一列时是有意义的。在您的例子中,
valuesdesc
临时执行“另一列”,然后它获得自己的目标值--“再见,valueid”,并且
valueid
具有一种愚蠢的外观,带有无意义的引用。