История изменений
Исправление theNamelessOne, (текущая версия) :
Триггером же. Как-то так:
CREATE FUNCTION restrict_row_updates_if_archived()
  RETURNS trigger AS 
$$
  BEGIN
    IF OLD.isArchive THEN
      RAISE EXCEPTION 'Cannot update archived row';
    END IF;
    RETURN NEW;
$$ LANGUAGE plpgsql;
CREATE TRIGGER make_my_table_archived_row_immutable
        BEFORE UPDATE 
            ON my_table
           FOR EACH ROW
          WHEN (OLD.* IS DISTINCT FROM NEW.*)
       EXECUTE PROCEDURE restrict_row_updates_if_archived();
(для одного и того же пользователя)
Что это значит?
Исправление theNamelessOne, :
Триггером же. Как-то так:
CREATE FUNCTION restrict_row_updates_if_archived()
  RETURNS trigger AS 
$$
  BEGIN
    IF OLD.isArchive THEN
      RAISE EXCEPTION 'Cannot update archived row';
    END IF;
    RETURN NEW;
$$ LANGUAGE plpgsql;
CREATE TRIGGER make_my_table_archived_row_immutable
        BEFORE UPDATE 
            ON my_table
           FOR EACH ROW
       EXECUTE PROCEDURE restrict_row_updates_if_archived();
(для одного и того же пользователя)
Что это значит?
Исходная версия theNamelessOne, :
Триггером же. Как-то так:
CREATE FUNCTION restrict_row_updates_if_archived()
  RETURNS trigger AS 
$$
  BEGIN
    IF OLD.isArchive THEN
      RAISE EXCEPTION 'Cannot update archived row';
    END IF;
    RETURN NEW;
$$ LANGUAGE plpgsql;
CREATE TRIGGER make_my_table_archived_row_immutable
        BEFORE UPDATE 
            ON my_table
           FOR EACH ROW
       EXECUTE PROCEDURE restrict_row_updates_if_archived();