Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.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触发器_Sql_Tsql - Fatal编程技术网

对另一个表进行解析和存在性检查的SQL触发器

对另一个表进行解析和存在性检查的SQL触发器,sql,tsql,Sql,Tsql,因此,我有一个工作订单表,其中有3个字段与这里提出的问题相关 (带有一些示例值的dbo.workorder): 最后两行表明,有时在插入导致问题的工作单行时,主管/所有者组未填写!我有另一个名为“角色”的表,其行如下: role | value ABCSupervisor | JSMITH ABCOwnergroup | ALPHA XYZSupervisor | JDOE XYZOwnergroup | OMEGA 从“角色”表中可以看到,角色由位置的前3个字母(始终)加上

因此,我有一个工作订单表,其中有3个字段与这里提出的问题相关 (带有一些示例值的dbo.workorder):

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

role          | value
ABCSupervisor | JSMITH
ABCOwnergroup | ALPHA
XYZSupervisor | JDOE
XYZOwnergroup | OMEGA
从“角色”表中可以看到,角色由位置的前3个字母(始终)加上单词Supervisor或Ownergroup组成。当插入“workorder”表的第3行和第4行时,我想开发一个触发器,如果“roles”表中有匹配项,它将尝试填充Supervisor/Ownergroup的值。如果该位置前缀没有supervisor/ownergroup,那么它应该默认为一个设置值(比如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
我猜是否存在这样的情况?可能涉及左(wo.location,3)+“Ownergroup”之类的内容

非常感谢您的任何帮助!谢谢
澄清: wonum是“workorder”表的主键。我将“插入的”表(其中包含正在插入或更新的行)加入到“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

我不确定wonum列是什么(尽管我假设它是工作订单),也不确定它是否加入了它们,但如果它加入了它们,您看起来想用roles表中的value列更新ownergroup

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

如果我误解了您想要什么,请告诉我。

我不确定wonum列是什么(尽管我假设它是工作单),以及它是否加入了它们,但如果是这样,您看起来想用角色表中的值列更新您自己的组

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

如果我误解了您的要求,请告诉我。

您如何根据角色信息更新workorder表,如下所示:

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
然后,您可以对主管角色执行类似的更新

理论上,完整的答案是:

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

如何根据角色中的信息更新workorder表,如下所示:

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
然后,您可以对主管角色执行类似的更新

理论上,完整的答案是:

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

第一步-重建您的表以将逻辑上独立的数据保留在单独的列中-即,将
ABC
部分保留在单独的列中(在两个表中)。@Damien_the_Insiever:不幸的是,这不是一个选项,因为数据库结构由应用程序(IBM的Maximo资产管理平台)决定。如果它不是由您控制的数据库,那么实现使查询工作的视图,并让基础表控制(mad)不是更好吗没有正确填充它们的系统?第一步-重建表以将逻辑上独立的数据保留在单独的列中-即将
ABC
部分保留在单独的列中(在两个表中)。@Damien_the_envisiver:不幸的是,这不是一个选项,因为数据库结构由应用程序指定(IBM的Maximo资产管理平台)。如果它不是由您控制的数据库,那么实现使您的查询正常工作的视图,并将底层表置于(mad)系统的控制之下,而该系统无法正确填充它们,这不是更好吗?对不起……wonum是连接“workorder”上“inserted”表的主键字段表,这样触发器只在插入/更新的行上执行。在我的示例中,我根本没有加入角色表OK,我更改了示例以反映这一点。看起来一切正常。我接受了KAJ的回答,因为它解决了角色不存在的问题,因此插入了默认值。对不起……wonum是主键字段that连接“工单”上的“插入”表格表,这样触发器只在插入/更新的行上执行。我根本没有加入角色表。在我的示例中,我更改了示例以反映这一点。看起来一切正常。我接受了KAJ的回答,因为它解决了角色不存在的问题,因此插入了默认值。我更新了问题以反映我的clar抱歉,误解!我意识到我忽略了默认值,所以我将其添加到我的解决方案中-认为这涵盖了它我更新了我的问题以反映我的澄清。抱歉误解!我意识到我忽略了默认值,所以我将其添加到我的解决方案中-认为这涵盖了它