Postgres, как я могу отказать в создании базы данных с именем werid (конечный пробел, начальный пробел или даже избежать использования пробела в имени базы данных) - PullRequest
0 голосов
/ 15 апреля 2020

Я пытаюсь добавить некоторые ограничения на команду создания базы данных в PostgreSQL.

В настоящее время я могу сделать

psql -c "CREATE database \"     x  y\"\"z'     \""

Затем я получу базу данных с именем буквально " x y"z' " (без границы двойных кавычек). Кажется, что pg sql поддерживает любые символы в имени базы данных, что круто. Но это вызывает у меня головную боль, когда я занимаюсь автоматизацией со скриптом bash. Да, некоторая дополнительная работа может быть выполнена для обработки этих случаев в сценарии. Но я думаю, что такие имена на самом деле бессмысленны (по крайней мере, в моей ситуации :), поэтому есть способ добавить некоторые ограничения на именование баз данных. Например, разрешить только [a-zA-Z0-9 _.] +.

1 Ответ

1 голос
/ 15 апреля 2020

Только не используйте двойные кавычки, которых вам все равно следует избегать, если это вообще возможно. См. Документация :

SQL идентификаторы и ключевые слова должны начинаться с буквы (az, но также буквы с диакритическими знаками и нелатинскими буквами) или подчеркивания (_ ). Последующими символами в идентификаторе или ключевом слове могут быть буквы, подчеркивания, цифры (0-9) или знаки доллара ($). Обратите внимание, что знаки доллара не допускаются в идентификаторах в соответствии с буквой стандарта SQL, поэтому их использование может сделать приложения менее переносимыми. Стандарт SQL не будет определять ключевое слово, которое содержит цифры, начинается или заканчивается подчеркиванием, поэтому идентификаторы этой формы защищены от возможного конфликта с будущими расширениями стандарта. ... Существует второй тип идентификатора: идентификатор с разделителями или идентификатор в кавычках. Он формируется путем заключения произвольной последовательности символов в двойные кавычки ("). Идентификатор с разделителями всегда является идентификатором, а не ключевым словом. ... Идентификаторы в кавычках могут содержать любой символ, кроме символа с нулевым кодом. включите двойные кавычки, напишите две двойные кавычки.) Это позволяет создавать имена таблиц или столбцов, которые в противном случае были бы невозможны, например, содержащие пробелы или амперсанды.

Не удваивая кавычки в ваших примерах, эти имена недействительны, и Postgres не имеет проблем, рассказывая об этом. Так что просто не используйте их.

Также вы можете создать триггер события. Внутри него вы можете ограничивать имена объектов по мере необходимости, особенно полезно, если у вас есть строгие стандарты именования. Это позволило бы применять эти стандарты в базе данных;

create function app_validate_table_name()
    returns event_trigger
    language 'plpgsql'
as $$
begin
  if obj.object_identity ~! '[A-Za-z$_][[A-Za-z0-9$_]{0,62}'
  then 
      raise exception 'App Error: Request Name (%) is invalid for <Your App Name here>',obj.object_identity;
  end if
  return;
end ;
$$;

create event trigger app_table_event_trigger on ddl_command_end
    when tag in ('ALTER TABLE', 'CREATE TABLE')
    execute procedure app_validate_table_name();

Хотя то же самое можно применять к другим объектам, оно, к сожалению, не относится к созданию самой базы данных. Отказ от ответственности: Выше не было проверено.

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