Я не хочу, чтобы поле для конкретной строки не обновлялось вообще - PullRequest
0 голосов
/ 19 сентября 2019

У меня есть таблица с именем users, в которой есть поле для учетной записи ... возможные значения этого поля: Y и N ... если пользователь из внешнего интерфейса входит в систему с 3 попытками ввода неверного пароля, то accountlocked будет Y, что означаетучетная запись заблокирована ... но у меня есть определенный пользователь, который не хочет, чтобы заблокированная учетная запись была обновлена ​​до Y ... Я создал триггер, который может обновить его до N, если это Y ... но я просто неЯ не хочу, чтобы поле было обновлено до Y atall в первую очередь для этого конкретного пользователя

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, но я не хочу, чтобы оно обновлялось доДа, во-первых, что-то вроде вместо ... но вместо того, чтобы работать только для представлений, а не таблиц в oracle

Примечание: я могу сделать это с помощью кода Java, но я не ищу это решение, поскольку ононеобходимо развернуть и будущие проблемы

Ответы [ 2 ]

2 голосов
/ 19 сентября 2019

Для чего существуют ограничения?

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

Готово!

С уважением, Стью Эштон

2 голосов
/ 19 сентября 2019

Это был бы этот.Тем не менее, я думаю, вы должны решить эту проблему лучше на уровне приложения.

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;

- только что обновлен с рабочей версией

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...