PostgreSQL纯命令行操作

Eave 2026.08.26

一、基本操作

1.主键列修改为自增

-- 新增语句:id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY
ALTER TABLE 表名 
    ALTER COLUMN id SET NOT NULL,
    ALTER COLUMN id ADD GENERATED ALWAYS AS IDENTITY;

注:GENERATED ALWAYS:禁止手动指定值,只能由系统生成,GENERATED BY DEFAULT:允许手动指定值(类似 SERIAL)。

2、修改表字段类型

ALTER TABLE 表名
    ALTER COLUMN balance TYPE numeric -- 列类型改为numeric类型
    USING balance::numeric; -- 将已有数据转为numeric类型的方式

二、用户创建、授权等

1.创建账号

CREATE USER username WITH PASSWORD '123456';

-- 和上面的效果一样
CREATE USER username WITH 
    LOGIN         -- 允许该角色登录数据库
    NOSUPERUSER   -- 禁止该角色拥有超级用户权限
    NOCREATEDB    -- 禁止该角色创建数据库
    NOCREATEROLE  -- 禁止该角色创建新角色(用户)或修改其他角色
    NOREPLICATION -- 禁止该角色用于流复制
    INHERIT       -- 该角色继承其所属组角色的权限
    PASSWORD '123456';

-- 查看当前用户
SELECT session_user;

SELECT current_user;

-- 查看角色属性
SELECT 
    rolname,
    rolsuper,      -- 是否为超级用户
    rolinherit,    -- 是否继承权限
    rolcreaterole, -- 是否能创建角色
    rolcreatedb,   -- 是否能创建数据库
    rolcanlogin,   -- 是否能登录
    rolreplication -- 是否能用于复制
FROM pg_roles 
WHERE rolname = 'username';

2.修改密码

-- 修改当前用户的密码
ALTER USER current_user PASSWORD '123456';

-- 修改指定用户的密码
ALTER USER username PASSWORD '123456';

3.锁定/解锁账号

-- 锁定
ALTER USER username NOLOGIN;

-- 解锁
ALTER USER username LOGIN;

4.查看用户密码算法、权限

-- 查看密码算法(需 superuser)
SELECT rolname, rolpassword FROM pg_authid;

-- 查看用户属性
SELECT rolname, rolcanlogin, rolsuper, rolcreaterole, rolcreatedb FROM pg_roles ORDER BY rolname;

5.用户授权

-- 允许连接数据库
GRANT CONNECT ON DATABASE appdb TO username;

-- 只给某 schema 使用权限(在当前连接库里)
GRANT USAGE ON SCHEMA public TO username;

-- 允许读写已有表的数据(在当前连接库里)
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO username;

-- 允许在 schema 下创建表(在当前连接库里)
GRANT CREATE ON SCHEMA public TO username;

-- 未来新建表也自动授权
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO username;

-- 允许执行函数、存储过程
GRANT EXECUTE ON FUNCTION public.calculate_amount TO username;

-- 授权已有函数
GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA public TO username;

-- 授权未来新建函数(用 schema owner 执行)
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT EXECUTE ON FUNCTIONS TO username;

6.权限撤销

-- 撤销连接数据库
REVOKE CONNECT ON DATABASE appdb FROM username;

-- 撤销 schema 使用权限(在当前连接库里)
REVOKE USAGE ON SCHEMA public FROM username;

-- 撤销读写已有表的数据(在当前连接库里)
REVOKE SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public FROM username;

-- 撤销在 schema 下创建表(在当前连接库里)
REVOKE CREATE ON SCHEMA public FROM username;

-- 撤销执行函数、存储过程
REVOKE EXECUTE ON FUNCTION public.calculate_amount FROM username;

-- 撤销已有函数
REVOKE EXECUTE ON ALL FUNCTIONS IN SCHEMA public FROM username;

7.删除用户

-- 先清依赖,否则会报 cannot drop role ... because some objects depend on it
REASSIGN OWNED BY username TO postgres;
DROP OWNED BY username;
DROP USER username;

三、系统配置

此种配置将写入自动配置文件postgresql.auto.conf中,postgresql.auto.conf中的同名参数优先级更高,会覆盖postgresql.conf。

-- 查看当前配置
SHOW lc_numeric;

-- 写入postgresql.auto.conf
ALTER SYSTEM SET lc_numeric = 'en_US.UTF-8';

-- 让运行中的实例重新加载配置
SELECT pg_reload_conf();

删除自动配置,回退到conf或内置默认

ALTER SYSTEM SET lc_numeric = DEFAULT;   -- 等价 ALTER SYSTEM RESET lc_numeric;
SELECT pg_reload_conf();