如何在单条SQL语句中批量给指定表授予增删改查权限
批量给指定数据库表授予增删改查权限的方法
方法1:手动批量生成授权语句(适合表数量少的场景)
如果只有20张表,直接用文本编辑器快速生成所有授权语句最省事:
- 把20张表的名称按每行一个列出来
- 用编辑器的「查找替换」功能(开启正则匹配),把每行表名套进授权模板:
- 查找内容:
^(.*)$ - 替换内容:
Grant insert, update, delete, select ON \$1` TO All_roles;`
- 查找内容:
- 把生成好的所有语句复制到数据库客户端执行即可
方法2:利用数据库系统表生成动态SQL(适合可复用场景)
不同数据库可以通过查询系统表自动拼接授权语句,以下是常见数据库的示例:
MySQL/MariaDB
执行以下SQL查询,会返回所有指定表的授权语句,复制结果执行即可:
SELECT CONCAT( 'Grant insert, update, delete, select ON `', table_name, '` TO All_roles;' ) AS grant_statement FROM information_schema.tables WHERE table_schema = '你的数据库名称' -- 替换为实际库名 AND table_name IN ('表1', '表2', ..., '表20'); -- 替换为你的20张表名
PostgreSQL
执行以下SQL生成授权语句,复制结果执行:
SELECT 'GRANT INSERT, UPDATE, DELETE, SELECT ON ' || quote_ident(table_name) || ' TO All_roles;' AS grant_statement FROM information_schema.tables WHERE table_schema = 'public' -- 替换为实际schema名,默认是public AND table_name IN ('表1', '表2', ..., '表20');
如果想直接执行生成的语句,可使用DO块自动循环执行:
DO $$ DECLARE rec RECORD; BEGIN FOR rec IN ( SELECT table_name FROM information_schema.tables WHERE table_schema = 'public' AND table_name IN ('表1', '表2', ..., '表20') ) LOOP EXECUTE 'GRANT INSERT, UPDATE, DELETE, SELECT ON ' || quote_ident(rec.table_name) || ' TO All_roles;'; END LOOP; END $$;
方法3:用脚本批量执行(适合自动化场景)
如果需要频繁做这类操作,可以写简单脚本循环执行授权语句,以MySQL的shell脚本为例:
#!/bin/bash DB_NAME="你的数据库名" TABLES=("表1" "表2" ... "表20") # 填入你的20张表名 DB_USER="你的数据库用户名" DB_PASS="你的数据库密码" for TABLE in "${TABLES[@]}" do mysql -u"$DB_USER" -p"$DB_PASS" "$DB_NAME" -e "Grant insert, update, delete, select ON \`$TABLE\` TO All_roles;" done
注意事项
- 执行授权语句的账号需要拥有
GRANT OPTION权限,否则会报错 - 如果表名包含特殊字符(比如空格、关键字),一定要用反引号(MySQL)或
quote_ident(PostgreSQL)包裹,避免语法错误 - 批量执行前建议先单独测试一条授权语句,确认权限授予正常后再推进
内容的提问来源于stack exchange,提问作者Aman Mahaseth
相关产品推荐
相关产品推荐

