🍁 博主 "开着拖拉机回家"带您 Go to New World.✨🍁
🦄 个人主页------🎐开着拖拉机回家_Linux,Java基础学习,大数据运维-CSDN博客 🎐✨🍁
🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批评指正!🍁🐥
目录
[🍁 博主 "开着拖拉机回家"带您 Go to New World.✨🍁](#🍁 博主 "开着拖拉机回家"带您 Go to New World.✨🍁)
[1.1 初始角色](#1.1 初始角色)
[1.2 权限 - PRIVILEGES](#1.2 权限 - PRIVILEGES)
[1.3 权限的组成](#1.3 权限的组成)
[1.4 特殊的权限](#1.4 特殊的权限)
[1.5 授权 - GRANT](#1.5 授权 - GRANT)
[六、postgresql 执行sql文件](#六、postgresql 执行sql文件)
一、PostgreSQL权限概述
1.1 初始角色
数据库刚创建时,会自动创建一个超级用户的角色:postgres。任何操作都是从该用户开始的。
PostgreSQL权限管理详解_pgsql权限管理_zou8944的博客-CSDN博客(摘录博客)
1.2 权限 - PRIVILEGES
角色有了,决定角色能够执行哪些数据库操作,则需要权限进行管理。PG将权限分为了两部分。这里所说的权限,主要指第二部分
- 能否登录、创建database、创建role,这类重要权限,在创建role时指定;在pg_roles表中可查看
- 对数据库对象的各类操作的权限,通过GRANT手动授予;在information_schema.xxx_privileges表中可查看,比如information_schema.table_privileges
1.3 权限的组成
一个完整的权限描述:角色A对表table1具有SELECT权限,有三部分组成
- 角色:A
- 授权目标:table1
- 权限:SELECT
1.4 特殊的权限
1、owner拥有特权
当一个数据库对象被创建后,它会被自动分配一个owner,一般来说是执行创建语句的那个角色。大多数情况下,owner及其成员能够对该对象做任何事,如果其他人想要操作它,则需要GRANT授权。
可修改owner,超级用户、对象原本的owner、owner的成员都能够调整对象的owner
sql
alter table table_name owner to new_owner;
2、PUBLIC
PUBLIC并不是一个真正的角色,确切地说,它应该算一个关键字,当授权的目标是它时,表示:授予系统中的所有角色,包括今后定义的角色。
PUBLIC默认是拥有以下权限
- 本地登录
- 对public的USAGE权限
- 对public的CREATE权限
字面意思理解,相当于将该权限公开。
1.5 授权 - GRANT
sql
-- 授予权限
GRANT {权限} ON {授权目标} TO {被授权角色} [WITH GRANT OPTION]
-- 授予角色
GRATE {角色} TO {被授权角色} [WITH ADMIN OPTION] [GRANTED BY 角色]
ALL PRELEGES:它是针对一个授权目标的所有权限的总和。
**WITH ADMIN OPTION:**授权传递,被授权的角色,可以传递授权
cs
# 授予用户 zhangsan 数据库 kangkang 的所有权限
grant all privileges on database kangkang to zhangsan;
# 授权当前database 的指定kangll_schema的所有表的只读权限给zhangsan 角色
grant select on all tables in schema kangll_schema to zhangsan;
**如下查询结果表示:**kangll_test 数据中 public 下 stu 表,kangll 用户拥有所有权限, zhang 用户拥有只读权限,都是 kangll 用户授予的。
我们换个数据库查询下,可以看到 Access privileges为空,表明:其owner对该表有完整的权限
二、Schema创建和授权实操
创建数据库 kangkang, 我使用 postgres用户 完成
cs
CREATE DATABASE kangkang;
创建名为 zhangsan 的用户,请运行以下命令:
sql
CREATE USER zhangsan WITH PASSWORD '123456';
-- 修改密码
alter user zhangsan with password 'password';
授予zhangsan用户 kangkang 数据库的所有权限
cs
grant all privileges on database kangkang to zhangsan;
现在 使用zhangsan 用户登录数据库, 创建名为 kangll_schema 的 schema
sql
CREATE SCHEMA kangll_schema;
## 删除可以执行如下命令
DROP SCHEMA kangll_schema;
执行结果:
授予名为 zhangsan 用户对名为 kangll_schema 的 schema 下表的所有操作权限
cs
GRANT USAGE ON SCHEMA kangll_schema to zhangsan;
grant all privileges on all tables in schema kangll_schema to zhangsan;
grant all privileges on all sequences in schema kangll_schema to zhangsan;
grant select,insert,update,delete on all tables in schema kangll_schema to zhangsan;
授权完成
kangkang数据库中创建 stu 表
sql
CREATE TABLE kangll_schema.stu(
stu_id BIGINT NOT NULL,
stu_name VARCHAR(255) NOT NULL);
# 插入数据
INSERT INTO kangll_schema.stu VALUES(1, 'kangll');
# 查询
SELECT * FROM kangll_schema.stu;
执行过程:
可以看到 zhangsan 用户对 stu 表拥有所有权限, 也可以看到 Access privileges为空
撤销 权限后 重新分配 只读权限, zhangsan 用户拥有只读权限,且权限是 zhangsan 用户授予的 ,可以看到 Access privileges 不为空 ,为zhangsan 用户的 "r" 权限。
三、重新为用户授权
sql
-- 取消权限
REVOKE [GRANT OPTION FOR] {权限} ON {授权目标} FROM {被授权人} [CASCADE | RESTRICT]
-- 取消角色
REVOKE [ADMIN OPTION FOR] {角色} FROM {被授权角色} [CASCADE | RESTRICT]
示例:
sql
-- 切换到doki_database下
\c kangkang
-- 收回用户在 kangll_schema 下所有表的所有权限
REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA kangll_schema FROM zhangsan;
-- 为zhangsan 赋予kangkang 数据库下的查询权限
GRANT select ON all TABLES IN SCHEMA kangll_schema to zhangsan;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA kangll_schema TO zhangsan;
执行过程:
四、查询schema是否存在
查询 PostgreSQL 数据库中是否存在某个特定的 schema,可以使用以下 SQL 命令:
sql
SELECT * FROM information_schema.schemata WHERE schema_name = 'kangll_schema';
查询可以看到 schema_name 和 对应schema的 所属者,如果查询结果为空则对应的schema 不存在。
五、客户端鉴权
角色创建后好,还需要确认pg_hba.conf 的配置, 如果没有配置并不能直接通过网络连接到PG服务端。一般我们都是在安装完数据库就需要配置。
cs
vim /var/lib/pgsql/15/data/pg_hba.conf
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all peer
# IPv4 local connections:
host all all 127.0.0.1/32 scram-sha-256
# IPv6 local connections:
host all all ::1/128 scram-sha-256
# Allow replication connections from localhost, by a user with the
# replication privilege.
local replication all peer
host replication all 127.0.0.1/32 scram-sha-256
host replication all ::1/128 scram-sha-256
host all all 0.0.0.0/0 md5
配置文件说明:
TYPE
- local:本地连接
- host:使用TCP/IP连接
DATABASE: 许连接的database
**USER:**允许连接的角色
ADDRESS: 允许的客户端地址,0.0.0.0/0表示允许所以客户端连接
**METHOD:**鉴权方式
- trust:无条件允许连接
- reject:无条件拒绝
- password:要求客户端提供未加密的密码进行身份验证,密码在网络上以明文形式传输,如果使用SSL,可以加密传输
- scram-sha-256:执行 SCRAM-SHA-256 身份验证,这是一种质询响应机制,这是目前最安全的方式,不过有的数据库客户端可能不支持。
- md5:也是一种质询响应机制
- peer:获取客户端操作系统的用户名,如果和请求连接的用户名一样。这只有在本地连接时才有用。
- xxx:都是其它的鉴权方式,官网参考: PostgreSQL: Documentation: 15: 21.1. The pg_hba.conf File
六、postgresql 执行sql文件
cs
# 切换到postgres用户
sudo -i -u postgres
psql -d testdb -U postgres -f /opt/PostgreSQL/Ambari-DDL-Postgres-CREATE.sql
或者
sudo -u postgres psql -d kangkang -U postgres -f /opt/PostgreSQL/Ambari-DDL-Postgres-CREATE.sql