Postgres,我怎么能拒绝创建一个带有werid名称的数据库(尾随空格、前导空格,甚至是数据库名称中使用空格的avl



我试图在PostgreSQL中的数据库创建命令上添加一些约束。

目前,我可以做

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

然后,我将得到一个名为" x y"z' "的数据库(没有双引号边界(。pgsql似乎支持其数据库名称中的任何字符,这很酷。但当我用bash脚本做自动化的事情时,它会让我头疼。是的,可以做一些额外的工作来处理脚本中的这些情况。但我认为这些类型的名称实际上是没有意义的(至少在我的情况下:(,那么,有没有一种方法可以对数据库命名添加一些约束。例如,只允许[a-zA-Z0-9_.]+.

只是不要使用双引号,如果可能的话,无论如何都应该避免。参见文档:

SQL标识符和关键字必须以字母(a-z(开头,而且带有变音标记的字母和非拉丁字母(或下划线(_(。标识符或关键字中的后续字符可以是字母、下划线、数字(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();

虽然这同样可以应用于其他对象,但不幸的是,它似乎不适用于创建数据库本身
免责声明:以上内容未经测试。

相关内容

最新更新