问题:
使用 CREATE ROLE 语句创建 PostgreSQL 角色会引发错误,如果该角色已经存在。如何仅在角色不存在时创建角色?
解决方案:
使用带有 PL/pgSQL 代码块的 DO 语句来执行角色创建有条件地:
DO $do$ BEGIN IF EXISTS ( SELECT FROM pg_catalog.pg_roles WHERE rolname = 'my_user') THEN RAISE NOTICE 'Role "my_user" already exists. Skipping.'; ELSE CREATE ROLE my_user LOGIN PASSWORD 'my_password'; END IF; END $do$;
优化:
为了避免潜在的竞争条件和性能开销,请考虑在异常处理机制中使用嵌套块:
DO $do$ BEGIN IF EXISTS ( SELECT FROM pg_catalog.pg_roles WHERE rolname = 'my_user') THEN RAISE NOTICE 'Role "my_user" already exists. Skipping.'; ELSE BEGIN -- nested block CREATE ROLE my_user LOGIN PASSWORD 'my_password'; EXCEPTION WHEN duplicate_object THEN RAISE NOTICE 'Role "my_user" was just created by a concurrent transaction. Skipping.'; END; END IF; END $do$;
以上是仅当 PostgreSQL 角色尚不存在时,如何创建它?的详细内容。更多信息请关注PHP中文网其他相关文章!