【问题标题】:I don’t want field for a specific row to not be updated atall我不希望特定行的字段根本不更新
【发布时间】:2019-09-19 13:29:49
【问题描述】:

我有一个名为 users 的表,其中有一个 accountlocked 字段...该字段的可能值是 Y 和 N ...如果来自前端的用户使用 3 次错误密码尝试登录,那么 accountlocked 将是 Y,这意味着帐户已锁定...但我有一个特定用户,我不希望将帐户锁定更新为 Y...我创建了一个触发器,一旦它是 Y...就可以将其更新为 N...但我只是不不希望该特定用户首先将字段更新为 Y

CREATE OR REPLACE TRIGGER traccountunlock AFTER
   UPDATE OF accountlocked ON users
   FOR EACH ROW
   WHEN (new.username=‘Testuser ’)
BEGIN
    IF :new.accountlocked = 'Y' THEN
        UPDATE users
        SET
            accountlocked = 'N'
        WHERE
            username IN (
                'Testuser'
            );

    END IF;
END;

这可行,但在字段更新为 Y 后它会执行此操作,但我不希望它首先更新为 Y,例如,而不是...,而不是仅适用于视图而不是 oracle 中的表

注意:我可以通过 java 代码做到这一点,但我不是在寻找那个解决方案,因为它需要部署和未来的问题

【问题讨论】:

  • 这应该在您的应用程序中更方便地处理。
  • 是的,我们知道,但出于各种原因,我们正在通过 SQL 寻找一些东西。感谢您对此进行调查
  • 就像@GMB 所说,您可以轻松地解决您的应用程序中的问题。你能解释一下为什么你不想这样做吗?我看到你不想因为部署和未来的问题,但你能更具体一点
  • 这有两个原因。 1.我不想在产品代码中硬编码一些测试用户 2.如果测试团队需要新用户或类似的东西,我们再次需要推送这些更改并在 sprint 过程中部署它,这又需要很多跟踪和昂贵的东西,因此希望借助触发器或 SQL DB @Collin 的某些东西来将其解耦

标签: java sql oracle triggers


【解决方案1】:

约束有什么用?

create table t (
  username varchar2(30),
  accountlocked varchar2(1) check( accountlocked in ('Y','N') ),
  constraint not_lock_testuser check( (username,accountlocked) != (('Testuser', 'Y')) )
);

完成!

最好的问候, 炖阿什顿

【讨论】:

  • 但是这个问题是更新失败了,它在日志中抛出了 500,我不希望这样......谢谢艰难
【解决方案2】:

就是这个。但是,我认为您应该在应用程序级别更好地解决它。

CREATE OR REPLACE TRIGGER traccountunlock 
   BEFORE UPDATE OF accountlocked ON users
   FOR EACH ROW
   WHEN (new.username = 'Testuser')
BEGIN
    IF :new.accountlocked = 'Y' THEN
        :new.accountlocked := 'N';
    END IF;
END;

--刚刚更新到工作版本

【讨论】:

  • 试过这个但是得到一个错误 Error(2,28): PLS-00103: Encountered the symbol "=" when期待以下之一: := 。 (@% ; 指标@Wernfried Domscheit
  • :new.accountlocked = 'N'后面需要一个分号
  • 冒号和半冒号
  • 非常感谢 Wernfried 和 Bob
猜你喜欢
  • 2022-11-12
  • 2021-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-17
  • 1970-01-01
  • 2015-12-09
  • 2015-03-09
相关资源
最近更新 更多