【问题标题】:Transact-SQL Trigger with loop带循环的 Transact-SQL 触发器
【发布时间】:2019-03-30 14:14:18
【问题描述】:

我有几个小时的问题。我有 3 个表,我想在表 Project 上设置一个触发器,以检查是否有人将 Leiternr 更新为 null 它只能在 Projekt 表的 Pronr 没有来自 Table MiPro 的 Mitnr 时完成

到目前为止,我所拥有的是这个。但是当超过 1 个 Leitnr 为空时,它就不再起作用了。从逻辑上讲,这在逻辑上是“在哪里亲”的原因 nr = (从 projekt3 中选择 pronr,其中 leiternr 为空)) > 0"

但是我怎样才能实现我想要的呢?

create trigger Leiternr on projekt3 after update
as 
begin
if (select count(*) from mipro3 where pronr = (select pronr from projekt3 where leiternr is null)) > 0
begin
    RAISERROR ('Projekt has still Member', 16, 1);
    ROLLBACK TRANSACTION;
    RETURN 
end

结束

【问题讨论】:

  • 首先,只有您知道“不起作用”是什么意思。请明确点。接下来,您包含 3 个表格的 IMAGE - 但其中一个似乎完全没有意义。是吗?最后,不要将重要信息发布为图像。对于这样的问题,需要查看所涉及的表的 DDL,以了解表之间的关系。将其作为脚本执行 - 其中包括插入语句形式的示例数据。看来你需要测试是否存在——据我所知,没有必要计算任何东西。但是你的描述不清楚。
  • 抱歉给我带来了麻烦。是的,其中一张桌子毫无意义。我刚刚添加了这个表来完成。我认为图片比DDL更好。但是,是的,我本可以添加理由:/感谢您的提示。欢呼

标签: sql-server tsql database-trigger


【解决方案1】:

看起来你真的很亲密。我认为您只需要将“=”更改为“in”。这样您就可以比较多个记录。像这样:

create trigger Leiternr on projekt3 after update
as 
begin
if (select count(*) from mipro3 where pronr in (select pronr from projekt3 where leiternr is null)) > 0
begin
    RAISERROR ('Projekt has still Member', 16, 1);
    ROLLBACK TRANSACTION;
    RETURN 
end

【讨论】:

  • 澄清一下,这旨在检查 mipro3 中是否有 any 行,其中相应的 projekt3 具有空值。这里没有检查要更新的特定 projekt3 行是否为空,它的 any 行。这就是你想要的吗?
  • 非常感谢。正是我需要的。
  • 太棒了!我很高兴这对你有用!你介意将我的解决方案也标记为答案吗?在这一点上,我足够新,我需要我能得到的所有积分:-p
猜你喜欢
  • 1970-01-01
  • 2017-08-28
  • 1970-01-01
  • 2021-08-29
  • 2015-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-10
相关资源
最近更新 更多