SQL触发器,在另一个表上进行解析和存在检查

时间:2012-02-27 18:09:01

标签: sql tsql

所以我有一个工单表,其中有3个字段与此处提出的问题相关 (带有一些样本值的dbo.workorder):

location | supervisor | ownergroup
ABC-123  | JSMITH     | ALPHA
XYZ-987  | JDOE       | OMEGA
ABC-123  | NULL       | NULL
XYZ-987  | NULL       | NULL

最后两行是为了表明在插入导致问题的工作订单行时有时没有填写主管/所有者组!我有另一个名为“roles”的表,其行如下所示:

role          | value
ABCSupervisor | JSMITH
ABCOwnergroup | ALPHA
XYZSupervisor | JDOE
XYZOwnergroup | OMEGA

从“角色”表中可以看出,角色由位置的前3个字母(总是)加上Supervisor或Ownergroup一词组成。当插入“workorder”表的第3行和第4行时,我想开发一个触发器,试图填写Supervisor / Ownergroup的值,如果“roles”表中存在匹配项。如果没有该位置前缀的主管/所有者组,那么它应该默认为设定值(比如supervisor ='super'和ownergroup ='og')。这是我到目前为止所做的,不过可能采用不同的方法会更好:

CREATE TRIGGER [dbo].[OwnergroupSupervisor]
   ON  [dbo].[workorder]
   AFTER INSERT,UPDATE
AS 
BEGIN
    SET NOCOUNT ON;

    UPDATE wo
        SET wo.ownergroup= (THIS IS WHERE I NEED HELP)

    FROM dbo.workorder AS wo INNER JOIN inserted AS i ON wo.wonum=i.wonum
    WHERE wo.ownergroup IS NULL
END
GO

我猜一个IF EXISTS或者某种情况?可能涉及LEFT(wo.location,3)+'Ownergroup'之类的东西?

非常感谢任何和所有帮助!谢谢!

<小时/> 澄清: wonum是“工作订单”表的主键。我正在将“inserted”表(包含正在插入或更新的行)加入“workorder”表,这样我只更新新的/更新的行而不是整个“workorder”表。我现在的问题中没有任何内容与“角色”表有任何关系。请参阅下面的更新1,以便更好地了解我正在做的事情......
更新1:

我已经找到了一个解决方案,但是如果“roles”表中没有任何内容,它只会让supervisor / ownergroup为null,而不是将其更改为默认值。我现在可以处理这个问题,但想要更好的选择。这就是我所拥有的:

CREATE TRIGGER [dbo].[OwnergroupSupervisor]
   ON  [dbo].[workorder]
   AFTER INSERT,UPDATE
AS 
BEGIN
    SET NOCOUNT ON;

    UPDATE wo
        SET wo.ownergroup=(SELECT value FROM roles WHERE role=LEFT(wo.location,3)+'Ownergroup')     
    FROM dbo.workorder AS wo INNER JOIN inserted AS i ON wo.wonum=i.wonum
    WHERE wo.ownergroup IS NULL

    UPDATE wo
        SET wo.supervisor=(SELECT value FROM roles WHERE role=LEFT(wo.location,3)+'Supervisor')     
    FROM dbo.workorder AS wo INNER JOIN inserted AS i ON wo.wonum=i.wonum
    WHERE wo.supervisor IS NULL
END

我还没有弄清楚如果在roles表中找到两行会发生什么(虽然我很确定应用程序限制了这一点,所以应该没问题)。但正如我上面提到的,如果在roles表中找不到任何角色,这只会使supervisor / ownergroup保持为NULL。

2 个答案:

答案 0 :(得分:2)

如何根据角色中的信息更新工作订单表如下:

update wo
set ownergroup = isnull(r.value, 'og')
from workorder wo
  left outer join roles r on r.role = left(wo.location, 3) + 'Ownergroup'
where wo.ownergroup is null

然后,您可以对Supervisor角色进行类似的更新。

理论上,完整答案如下:

create trigger [dbo].[ownergroupsupervisor]
   on  [dbo].[workorder]
   after insert,update
as 
begin
    set nocount on;

    update wo
    set wo.ownergroup= isnull(r.value, 'og')
    from dbo.workorder as wo 
      inner join inserted as i on wo.wonum=i.wonum
      left outer join roles r on r.role = left(wo.location, 3) + 'Ownergroup'
    where wo.ownergroup is null

    -- Repeat for Supervisor
end
go

答案 1 :(得分:1)

我不确定列winum是什么(虽然我认为它是工作单#),如果它加入它们,但是如果它确实你想要使用roles表中的value列更新你的所有者组

CREATE TRIGGER [dbo].[OwnergroupSupervisor]
   ON  [dbo].[workorder]
   AFTER INSERT,UPDATE
AS 
BEGIN
    SET NOCOUNT ON;

    UPDATE wo
        SET wo.ownergroup= r.value
    FROM
       dbo.workorder AS wo 
    INNER JOIN
       inserted AS i ON wo.wonum=i.wonum
    join
       roles r
          on left(wo.location,3) + 'Ownergroup'=r.role
    WHERE
      wo.ownergroup IS NULL
END

GO

如果我误解了你想要的东西,请告诉我。