Синтаксическая ошибка Postgresql UPDATE при исключении RAISE в состоянии CASE / IF - PullRequest
0 голосов
/ 26 сентября 2019

Я запутался в написании запроса Postgresql UPDATE с условием CASE (или IF).

Ожидаемое поведение: Я должен вызвать исключение и не выполнять обновление, если одно конкретное поле не равно NULL. Текущее поведение: Я пробую условия CASE и IF, но каждый раз, когда я получаю синтаксическую ошибку: Ошибка SQL [42601]: ОШИБКА: синтаксическая ошибка в или около "исключения". Мысли : может быть, есть способ достичь того же результата, добавив ограничение к таблице?

    UPDATE public.SomeTable 
SET Title = (
    case when EndDate IS null
        THEN 'new title' 
        ELSE raise exception 'Cannot update entity if EndDate is not null'
    end),
    Description = (
    case when EndDate IS null
        THEN 'new description' 
        ELSE raise exception 'Cannot update entity if EndDate is not null'
    end)
WHERE Id=4 

Версия: PostgreSQL 11.5 (Debian 11.5-1.pgdg90 +1) в x86_64-pc-linux-gnu, скомпилированном gcc (Debian 6.3.0-18 + deb9u1) 6.3.0 20170516, 64-разрядная

Ответы [ 2 ]

0 голосов
/ 26 сентября 2019

Единственный относительно удобный способ сделать это - использовать обновляемые представления:

create view vw_sometable as
    select t.*
    from sometable t
    where endDate is null
    with check option;

Затем вы вставите его в представление, а не в базовую таблицу.

Вы можетедалее уточните это, предоставив update разрешения для представления, но не для базовой таблицы, поэтому все update должны проходить через представление.

Хорошо, другой метод не вернул бы ошибку, но онне будет обновлять строки.Просто включите условие в предложение where:

UPDATE public.SomeTable 
    SET Title = 'new title',
        Description = 'new description' 
WHERE Id = 4 AND EndDate is null';

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

0 голосов
/ 26 сентября 2019

удалить регистр после окончания

UPDATE public.SomeTable 
SET Title = (
    case when EndDate IS null
        THEN 'new title' 
        ELSE 'Cannot update entity if EndDate is not null'
    end ),
    Description = (
    case when EndDate IS null
        THEN 'new description' 
        ELSE 'Cannot update entity if EndDate is not null'
    end )
WHERE Id=4 
...