首页 > 数据库 > mysql教程 > 如何有条件地创建 PostgreSQL 角色以避免错误?

如何有条件地创建 PostgreSQL 角色以避免错误?

DDD
发布: 2024-12-17 19:37:10
原创
600 人浏览过

How Can I Create PostgreSQL Roles Conditionally to Avoid Errors?

通过条件执行创建 PostgreSQL 角色

问题介绍

在 PostgreSQL 9.1 中,如果角色已存在,则使用 CREATE ROLE 创建角色会失败。在编写数据库创建和角色管理脚本时,此限制带来了挑战。理想的解决方案是仅在角色不存在时有条件地执行 CREATE ROLE 语句。

条件脚本开发

一种方法是利用 PL/pgSQL 的 DO 块和 IF EXISTS 条件:

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$;
登录后复制

此脚本使用 SELECT 动态检查角色是否存在并执行 CREATE ROLE仅当角色不存在时。

无竞争条件场景

此解决方案不会引入竞争条件。 IF EXISTS 条件确保仅当检查时角色不存在时才创建该角色。在检查和创建之间创建角色的任何并发事务都不会导致问题,因为该角色在 CREATE ROLE 执行时已经存在。

优化脚本(无异常处理)

为了进一步优化脚本,可以使用嵌套块来避免异常处理程序的成本:

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板