如何从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
相关产品推荐
相关产品推荐

