You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从Shell执行PostgreSQL的GRANT命令及数据库操作?

针对指定PostgreSQL数据库从Shell执行命令的方法

问题背景

我可以通过以下Shell命令恢复整个数据库:

sudo -u postgres psql -c "DROP DATABASE mynewdbname with (FORCE);"
sudo -u postgres psql -c "CREATE DATABASE mynewdbname;"
sudo -u postgres pg_restore -d mynewdbname /home/user/restore_20230824.sql -v

恢复完成后需要执行若干GRANT权限操作,目前每次都得手动进入psql交互模式执行:

sudo -u postgres psql
# 交互模式中输入:
\c mynewdbname 
GRANT ALL ON schema name_of_schema TO application_user_name;
GRANT ALL ON ALL TABLES IN schema name_of_schema TO application_user_name;

尝试直接从Shell执行单条GRANT命令失败:

sudo -u postgres psql -c "GRANT ALL ON schema name_of_schema TO application_user_name;"

报错:

ERROR:  schema "name_of_schema " does not exist

确认name_of_schema确实存在,推测是因为没有指定目标数据库。于是尝试用\c切换数据库后执行命令:

sudo -u postgres psql -c "\c mynewdbname; GRANT ALL ON schema name_of_schema TO application_user_name;"

却出现新错误:

\connect: invalid integer value "ON" for connection option "port"

核心需求:如何从Shell直接针对指定PostgreSQL数据库执行命令?

补充:使用Debian 12系统,拥有完全权限,希望所有命令可由普通用户执行,方便不熟悉技术的同事操作。


解决方案

方法1:直接指定目标数据库执行单条命令

使用psql的-d参数指定要操作的数据库,无需在命令内切换数据库:

sudo -u postgres psql -d mynewdbname -c "GRANT ALL ON schema name_of_schema TO application_user_name;"

这条命令会直接连接到mynewdbname数据库,执行引号内的GRANT语句。

方法2:一次性执行多条命令

如果需要执行多个权限操作,可将所有命令用分号分隔,放在同一个-c参数中,同时指定目标数据库:

sudo -u postgres psql -d mynewdbname -c "GRANT ALL ON schema name_of_schema TO application_user_name; GRANT ALL ON ALL TABLES IN schema name_of_schema TO application_user_name;"

方法3:用脚本文件批量执行命令

若有大量权限操作,建议把所有SQL命令写入脚本文件(比如grant_permissions.sql),内容如下:

GRANT ALL ON schema name_of_schema TO application_user_name;
GRANT ALL ON ALL TABLES IN schema name_of_schema TO application_user_name;
-- 可添加更多GRANT语句

然后执行脚本:

sudo -u postgres psql -d mynewdbname -f /path/to/grant_permissions.sql

这种方式更清晰易维护,适合给非技术同事使用——只需执行这一条命令即可完成所有权限配置。

方法4:简化普通用户执行流程

把恢复+权限配置的所有命令写成Shell脚本(比如restore_and_grant.sh),内容如下:

#!/bin/bash

# 定义变量,方便后续修改
DB_NAME="mynewdbname"
BACKUP_PATH="/home/user/restore_20230824.sql"
SCHEMA_NAME="name_of_schema"
APP_USER="application_user_name"

# 恢复数据库
sudo -u postgres psql -c "DROP DATABASE ${DB_NAME} with (FORCE);"
sudo -u postgres psql -c "CREATE DATABASE ${DB_NAME};"
sudo -u postgres pg_restore -d ${DB_NAME} ${BACKUP_PATH} -v

# 执行权限配置
sudo -u postgres psql -d ${DB_NAME} -c "GRANT ALL ON schema ${SCHEMA_NAME} TO ${APP_USER}; GRANT ALL ON ALL TABLES IN schema ${SCHEMA_NAME} TO ${APP_USER};"

给脚本添加执行权限:

chmod +x restore_and_grant.sh

普通用户只需运行./restore_and_grant.sh就能完成全流程,无需手动输入多条命令。


内容的提问来源于stack exchange,提问作者realtebo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 11:42:40