Запретить пользователям обновление столбца, если другой столбец пуст? - PullRequest
0 голосов
/ 21 января 2019

У меня есть mytable, в котором есть 3 целочисленных поля: id, status, project_id.

Я сказал людям, что они не должны прогрессировать в статусе после 4, прежде чем присвоить ему project_id значение.Естественно, люди не слушают, и в будущем возникают проблемы.

Есть ли способ вернуть ошибку, если кто-то попытается обновить статус с 4 на 5, когда столбец project_id равен null?Мне все еще нужны люди, чтобы иметь возможность обновлять статус с 2 или 3 до статуса 4 независимо от того, имеет ли он project_id.

Ответы [ 3 ]

0 голосов
/ 21 января 2019

Вы можете использовать CHECK ограничение , как предложено @stickbit, если вам нужны очень простые проверки.

Если вам нужна более сложная логика, вы можете использовать TRIGGER функциональность

CREATE FUNCTION check_status()
  RETURNS trigger AS
$mytrigger$
BEGIN
   IF OLD.status = 4 AND NEW.status >= 5 AND NEW.project_id IS NULL THEN
      RAISE EXCEPTION 'Project ID must be assigned before progressing to status 5';
   END IF;
   RETURN NEW;
END
$mytrigger$
LANGUAGE plpgsql;

CREATE TRIGGER project_id_check
BEFORE UPDATE ON "MyTable"
FOR EACH ROW EXECUTE PROCEDURE check_status();
0 голосов
/ 21 января 2019

Если у вас есть данные, нарушающие ваши желаемые правила, вы все равно можете использовать ограничение CHECK , как продемонстрировано с помощью закрепленного бита.Просто сделайте это NOT VALID:

ALTER TABLE mytable ADD CONSTRAINT project_id_required_for_status_5_or_higher
CHECK project_id IS NOT NULL OR status < 5) <b>NOT VALID</b>;

Тогда ограничение применяется только к последующим вставкам и обновлениям.Существующие строки игнорируются.(Но любое новое обновление должно исправить нарушающие значения, иначе оно завершится неудачей.)

У вас также должно быть ограничение FOREIGN KEY , обеспечивающее ссылочную целостность для project_id,иначе ограничение можно легко обойти с помощью фиктивных значений.

Замечательный момент: ограничение CHECK не только запрещает упомянутые вами обновления, но и вставляет с нарушающим состоянием.

Как только всеСтроки фиксируются в соответствии с новым правилом, вы можете VALIDATE ограничение:

ALTER TABLE mytable VALIDATE CONSTRAINT project_id_required_for_status_5_or_higher;

Подробнее:

0 голосов
/ 21 января 2019

Как насчет проверочного ограничения на таблицу:

CHECK (project_id IS NOT NULL OR status < 5)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...