Когда я выполняю этот скрипт
CREATE TRIGGER pdate_day_month_decade
AFTER UPDATE ON main."YDate"
FOR EACH ROW
WHEN (OLD."dayMonth" IS DISTINCT FROM NEW."dayMonth")
EXECUTE FUNCTION pdate_day_month_decade_trigger();
Я получаю сообщение об ошибке
ОШИБКА: схема «основная» не существует
Состояние SQL: 3F000
Однако INSERT и UPDATE работают с этой схемой правильно, и я проверил, что эта схема используется PUBLIC.
dn результат команды:
\dn
List of schemas
Name | Owner
--------+-------------------
main | postgres
public | pg_database_owner
Результат show search path:
"$user", public
1) В psql сделайте \dn и скопируйте результаты в виде текста в текст вопроса. 2) Также скопируйте и вставьте результат show search_path.
Привет и добро пожаловать в ТАК! Не имеет отношения к делу, но вам не обязательно использовать идентификаторы в кавычках в PostgreSQL — без них жизнь намного проще и понятнее! Я рекомендую вам использовать «Snake_case», но это дело вкуса и предпочтений.
@Vérace, вам придется использовать их, если вы хотите сохранить регистр или использовать зарезервированные слова или специальные символы. Читайте Идентификаторы.
@AdrianKlaver - да, возможно, мне следовало упомянуть об этом. Однако, насколько я понимаю, обязать себя сохранять регистр и/или использовать зарезервированные слова и/или знаки препинания в качестве имен таблиц/столбцов/<что угодно> - это просто напрашиваться на неприятности! Это делает SQL непереносимым, неразборчивым и трудным для отладки! Используя принцип KISS, 63 байта составляют i_think_this_is_quite_long_enough_dont_you_comma_i_certainly_do?
@Верас. Дело в том, что у вас может не быть выбора, вам придется иметь дело с присвоенным вам идентификатором.
@AdrianKlaver - ОК - последнее слово (направлено ОП), гораздо предпочтительнее не использовать идентификаторы, требующие кавычек - если вы обязаны, у вас нет выбора. Однако при отсутствии такого требования проще и лучше не использовать идентификаторы в кавычках. Я обнаружил, что многие пользователи PostgreSQL считают, что цитирование идентификаторов является обязательным, хотя (обычно) это не так. Я просто пытался это передать - вы (правильно) отметили, что это может потребоваться. ФП может ответить нам по поводу всего этого - резюме: «цитаты плохие, если это не требуется!»?
@kofemann это название схемы. Имя отношения — «YDate».
@AdrianKlaver, это $user"", public. Я пробовал добавить основной путь поиска перед скриптом, но это не помогло.
Вот почему я попросил вас сделать в psql команду \dn и скопировать результаты в виде текста в текст вашего вопроса. Предоставьте запрашиваемую информацию.
Добавил результаты, @AdrianKlaver
Хм. Что возвращает select nspname, length(nspname) from pg_namespace where nspname ilike 'main%';?
nspname: "main", длина: 4, @AdrianKlaver
1) Попробуйте reindex table pg_namespace ;. 2) Можете ли вы предоставить более подробную информацию о том, что означает «Однако INSERT и UPDATE работают в этой схеме правильно...»?





Таблица пространства имен переиндексации, предложенная @AdrianKlaver, сработала. После этого запроса:
reindex table pg_namespace;
Триггер успешно создан в базе данных.
Я бы следил за этим, это указывает на то, что индекс был поврежден. Это может быть либо аппаратная проблема, либо что-то (что-то) было не так с этой таблицей или системными таблицами в целом.
основное имя таблицы?