登录用户
psql -U postgres
# 指定数据库
psql -U postgres -d asciinema
添加可创建数据库的权限
ALTER ROLE asciinema WITH CREATEDB
重置密码
ALTER ROLE asciinema WITH PASSWORD 'newpassword';
授予连接权限(例如到 postgres
数据库):
GRANT CONNECT ON DATABASE postgres TO asciinema;
提升至超级用户权限(危险)
ALTER ROLE asciinema WITH SUPERUSER;
授予 asciinema
对 postgres
角色的权限
GRANT postgres TO asciinema;
切换角色
SET ROLE asciinema;
恢复原始角色
RESET ROLE;
# 查看当前用户
SELECT current_user;
# 查看当前数据库
SELECT current_database();
# 创建数据库
CREATE DATABASE asciinema;
# 转移所有权限给指定用户
ALTER DATABASE asciinema OWNER TO asciinema;
# 验证所有权是否已变更
SELECT datname, rolname
FROM pg_database
JOIN pg_roles ON pg_database.datdba = pg_roles.oid
WHERE datname = 'asciinema';
##
# 以 asciinema 身份执行命令
\c - asciinema
# 查看表
\dt
# 查看表结构(假设表名为 my_table)
\d my_table
# 显示详细信息
\d+
# 列出所有模式中的表
\dt *.*
# 仅列出特定模式的表
\dt public.*
# 查看角色属性
\du asciinema
# 检查数据库权限
\l mydb
# 检查表权限
\dp
# 启用扩展模式,以便查看数据
\x
# 终端宽度:垂直格式适合窄终端或字段较多的表。如果终端太宽,可调整 \pset columns
\pset columns 80
# 多记录:\x 模式下多条记录会逐条显示为垂直格式,可能较长。建议配合 LIMIT 使用:
SELECT * FROM my_table LIMIT 1 \x;
# 设置输出格式为 wrapped 或 aligned
\pset format wrapped
# 检查是否有活跃连接
SELECT pid, usename, client_addr, query
FROM pg_stat_activity
WHERE usename = 'asciinema' AND pid <> pg_backend_pid();
# 断开所有会话
SELECT pg_terminate_backend(pg_stat_activity.pid)
FROM pg_stat_activity
WHERE datname = 'asciinema' AND pid <> pg_backend_pid();
# 删除数据库
DROP DATABASE asciinema;
删除用户
-- 检查拥有的对象
SELECT * FROM pg_catalog.pg_class WHERE relowner = (SELECT oid FROM pg_roles WHERE rolname = 'asciinema');
-- 删除拥有的对象(或使用 REASSIGN OWNED 转移)
DROP OWNED BY asciinema;
-- 删除角色
DROP ROLE asciinema;
-- 验证删除
SELECT rolname FROM pg_roles WHERE rolname = 'asciinema';
-- 确保连接到正确的数据库
\c asciinema
-- 假设原所有者是 postgres,新所有者是 asciinema
-- 转移 postgres 用户在当前数据库中拥有的所有对象的所有权
REASSIGN OWNED BY postgres TO asciinema;
-- 授予新用户对 schema 的 USAGE 权限(以防权限缺失)
GRANT USAGE ON SCHEMA public TO asciinema;
-- 授予新用户对所有表的 SELECT、INSERT、UPDATE、DELETE 等权限
GRANT ALL ON ALL TABLES IN SCHEMA public TO asciinema;
-- 授予新用户对所有序列的 USAGE 和 SELECT 权限(如果表有序列)
GRANT ALL ON ALL SEQUENCES IN SCHEMA public TO asciinema;
-- 可选:验证表的所有权
\dt
-- 可选:检查权限
\dp