postgres 创建一个新的用户

在 PostgreSQL 中,创建一个新用户的方式可以通过 PostgreSQL 的命令行工具 psql 或者 SQL 命令来完成。下面是如何创建一个新的 PostgreSQL 用户的详细步骤:

1. 进入 PostgreSQL 交互模式

首先,登录到你的 PostgreSQL 数据库。可以通过以下命令进入 PostgreSQL:

sudo -u postgres psql

如果你正在使用 Docker 容器,你可以进入容器并执行 psql

docker exec -it <container_name> psql -U postgres

其中 <container_name> 是你的 PostgreSQL 容器的名称,通常在 docker-compose.yml 中指定为 strapiDB

2. 创建新用户

在 PostgreSQL 交互模式中,可以使用 CREATE USER 命令创建一个新用户。你可以指定用户名和密码:

CREATE USER new_username WITH PASSWORD 'password';

例如:

CREATE USER myuser WITH PASSWORD 'mypassword';

3. 为用户授予权限

默认情况下,新用户没有数据库访问权限。你可以使用 GRANT 语句将权限授予用户。通常,首先需要创建一个数据库,并将对该数据库的权限授予新用户:

创建数据库:

CREATE DATABASE mydb;

授予数据库权限:

GRANT ALL PRIVILEGES ON DATABASE mydb TO myuser;

你也可以只授予某些特定权限,例如连接权限或表的操作权限。

4. 退出 PostgreSQL

完成操作后,可以使用 \q 退出 PostgreSQL 交互模式:

\q

示例:

sudo -u postgres psql
CREATE USER myuser WITH PASSWORD 'mypassword';
CREATE DATABASE mydb;
GRANT ALL PRIVILEGES ON DATABASE mydb TO myuser;
\q

Docker 容器内操作:

如果你在 Docker 容器中运行 PostgreSQL,可以使用以下命令进入容器并执行上述 SQL 命令:

docker exec -it strapiDB psql -U postgres

给予所有权限

如果你想为 PostgreSQL 中的新用户授予所有权限,可以使用 GRANT 命令来授予该用户对特定数据库的所有权限。以下是授予所有权限的步骤:

1. 使用 GRANT 授予特定数据库的所有权限

在 PostgreSQL 中,GRANT ALL PRIVILEGES 语句可以用于将所有权限授予指定用户,适用于某个数据库的所有操作(如查询、插入、更新、删除等)。

假设你要授予用户 myuser 对数据库 mydb 的所有权限,命令如下:

GRANT ALL PRIVILEGES ON DATABASE mydb TO myuser;

2. 授予对所有表的权限

GRANT ALL PRIVILEGES ON DATABASE 只是授予用户在数据库级别的权限。为了让用户能对该数据库内的表和其他对象进行操作,你需要进一步授予对所有表的权限。

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO myuser;

这个命令将授予 myuserpublic schema 下所有表的权限(public 是默认 schema)。如果你有自定义 schema,请将 public 替换为相应的 schema 名称。

3. 授予对所有序列的权限

如果数据库中有自增字段(sequence),你还需要授予用户对所有序列的权限:

GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO myuser;

4. 授予对所有函数的权限

如果你希望新用户能够调用数据库中的所有函数,也可以授予函数调用权限:

GRANT ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public TO myuser;

5. 授予超级用户权限(可选)

如果你希望用户拥有数据库的超级权限(最高权限),可以授予超级用户角色,但这通常不推荐,除非你有非常强的理由,因为超级用户可以执行所有操作,包括管理数据库配置、创建和删除数据库等:

ALTER USER myuser WITH SUPERUSER;

请注意,授予超级用户权限会让该用户获得对整个 PostgreSQL 实例的完全控制,而不仅仅是某个数据库。

6. 完整示例

假设你要为用户 myuser 创建数据库 mydb 并给予所有权限,操作顺序如下:

sudo -u postgres psql
-- 创建用户
CREATE USER myuser WITH PASSWORD 'mypassword';

-- 创建数据库
CREATE DATABASE mydb;

-- 授予用户对数据库的所有权限
GRANT ALL PRIVILEGES ON DATABASE mydb TO myuser;

-- 授予用户对 public schema 下所有表的权限
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO myuser;

-- 授予用户对所有序列的权限
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO myuser;

-- 授予用户对所有函数的权限
GRANT ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public TO myuser;

-- (可选)授予超级用户权限
-- ALTER USER myuser WITH SUPERUSER;

这样,用户 myuser 就可以完全管理 mydb 数据库,并对其中的表、序列和函数执行所有操作。


permission denied for schema public

在 PostgreSQL 中,出现 "permission denied for schema public" 的错误,通常意味着用户缺乏访问数据库中 public 模式的权限。尽管你为用户授予了数据库级别的权限,但该用户可能没有足够的权限访问特定的模式(如 public)。

要解决这个问题,需要为 myuser 授予对 public 模式的权限。可以按照以下步骤操作:

1. 授予 public 模式的使用权限

使用以下命令为用户授予 public 模式的访问权限:

GRANT USAGE ON SCHEMA public TO myuser;

2. 授予 public 模式中对象的所有权限

授予用户对 public 模式中所有对象(如表、视图等)的操作权限:

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO myuser;

3. 授予未来对象的默认权限(可选)

如果你希望用户对未来创建的表也自动拥有权限,可以设置默认权限:

ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON TABLES TO myuser;

总结:

  1. 授予用户 public 模式的使用权限 (GRANT USAGE)。
  2. 授予用户对 public 模式中现有和未来对象的权限。

这样,myuser 应该可以在 mydb 数据库的 public 模式下正常操作。

没有创建表的权限
GRANT CREATE ON SCHEMA public TO mydb;  -- 允许在该模式下创建对象