Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database PostgreSQL:是否可以创建一个允许创建数据库的角色或用户,但只能使用特定的名称?_Database_Postgresql_Permissions - Fatal编程技术网

Database PostgreSQL:是否可以创建一个允许创建数据库的角色或用户,但只能使用特定的名称?

Database PostgreSQL:是否可以创建一个允许创建数据库的角色或用户,但只能使用特定的名称?,database,postgresql,permissions,Database,Postgresql,Permissions,用例: 我有一个web应用程序,它在每次测试运行时删除并重新创建一个测试数据库。我希望PG角色不是超级用户,也不是一个可以随意破坏或创建任何数据库的角色,而是允许它删除并创建一个特定的数据库名称,比如foo_test。这可能吗?您可以使用“安全定义器”选项创建一个函数,用于创建数据库并对其设置权限。当然,它需要位于受限角色可以连接的数据库中 您可能可以使用SQL函数完成所有操作,但使用plpgsql则很简单。hm,似乎您无法使用PostgreSQL本身完成这些操作(尽管我希望被证明是错误的);

用例:


我有一个web应用程序,它在每次测试运行时删除并重新创建一个测试数据库。我希望PG角色不是超级用户,也不是一个可以随意破坏或创建任何数据库的角色,而是允许它删除并创建一个特定的数据库名称,比如foo_test。这可能吗?

您可以使用“安全定义器”选项创建一个函数,用于创建数据库并对其设置权限。当然,它需要位于受限角色可以连接的数据库中


您可能可以使用SQL函数完成所有操作,但使用plpgsql则很简单。

hm,似乎您无法使用PostgreSQL本身完成这些操作(尽管我希望被证明是错误的);但您可以在应用程序层中强制执行。我发现这个()是关于限制数据库名称的长度的,但还没有具体到名称……好吧,我相信我以前在PostgreSQL的前一个版本中做过这件事,但那是很久以前的事了,以至于我忘记了它是如何做的。这与在拨款声明中使用globs或mask有关。因此,用户只能创建“prefix_*”数据库。如果这是唯一的方法,我会满足于将数据库创建限制为架构或命名空间。如果您担心无意中损坏现有(生产)数据库,我会说:出于测试目的使用不同的机器(VM)。如果不可能:使用不同的端口号在同一台机器上创建一个单独的实例。如果这是不可能的,请使用保留的数据库名,并允许测试进程对其执行所有操作,包括删除它。不允许它连接到其他数据库(或创建数据库)。测试过程可以创建和删除(级联)自己的模式。一个单独的(cron)脚本甚至可以删除和创建测试数据库,包括授权顺便说一句:如果您从源代码处编译和安装Postgres,有一个很好的选项“make test”,它在临时数据库上运行回归测试,临时数据库是动态创建和删除的。也许您可以从这些脚本中借用一些东西,但这行不通,因为不能在事务中调用CREATE DATABASE,而且函数总是在事务中运行。甚至还有一条特定的错误消息:
CREATE DATABASE无法从函数或多命令字符串执行,这会使事情变得复杂。我已经习惯了几乎所有的DDL都能很好地处理事务。这意味着您至少要在数据库之外创建数据库。您可以使用dblink进行循环,或者调用脚本形式pl/perlu或类似的形式,但这并不是很优雅。