<p>需显式授予目标数据库的CREATE权限并刷新,如GRANT CREATE ON db_name.* TO 'user'@'%'; FLUSH PRIVILEGES;</p>
MySQL 导入 SQL 报错 ERROR 1142: CREATE command denied 怎么办
不是权限没给全,是权限给了但没刷到当前账户层级。mysql 的权限分全局、库级、表级三层,create 和 drop 这类 ddl 权限必须显式授予对应数据库(或全局),且不能靠通配符模糊匹配生效。
常见错误现象:mysql -u user -p db_name 执行时卡在第一条 <code>CREATE TABLE 就报错,但用 SHOW GRANTS FOR 'user'@'host'; 看又显示有 CREATE —— 实际是权限只给了 *(所有库),而导入命令指定了 db_name,MySQL 会优先检查该库的显式授权,没命中就拒绝。
- 确认当前导入目标库名:比如命令里写了
mysql ... myapp_db ,那权限必须对 <code>myapp_db显式授予,不能只靠GRANT ALL ON *.* - 执行
GRANT CREATE, DROP, INSERT ON `myapp_db`.* TO 'user'@'host';(注意反引号包裹库名,避免关键字冲突) - 别忘了
FLUSH PRIVILEGES;,否则权限不立即生效 - 如果 SQL 文件含
CREATE DATABASE,还需额外加GRANT CREATE ON *.*,因为建库是全局操作
PostgreSQL 导入时报 permission denied for schema public
PostgreSQL 没有“库级权限”概念,权限绑定在 schema 上。即使你是数据库 owner,public schema 的默认权限也可能被重置,导致 INSERT 或 CREATE TABLE 失败。
使用场景:用 psql -U user -d mydb -f dump.sql 导入,文件里有 CREATE TABLE users,但用户没有 public 的 CREATE 权限。
- 先查当前 schema 权限:
\dn+ public(在 psql 里),看Access privileges是否包含user=UC(U=USAGE, C=CREATE) - 修复命令:
GRANT USAGE, CREATE ON SCHEMA public TO user; - 如果 SQL 含大量
INSERT,还要确保表已存在且用户有INSERT权限;若表不存在,需先有 schema 的CREATE,再让导入自动建表 - 注意:PostgreSQL 不支持
GRANT ALL ON SCHEMA,必须拆成USAGE和CREATE分别授
SQL Server 导入时提示 The SELECT permission was denied on the object 'sysobjects'
这是典型的角色缺失问题。SQL Server 的 INSERT 和 CREATE 权限不直接关联系统视图访问,但很多 GUI 工具(如 SSMS)或迁移脚本会在导入前查 sys.objects 判断对象是否存在——这时需要 VIEW DEFINITION 权限。
性能影响小,但缺了就卡住:哪怕你有 db_owner 角色,如果登录用户是 SQL 身份验证且未显式赋予 VIEW DEFINITION,某些工具仍会因查不到元数据而报错。
- 运行:
GRANT VIEW DEFINITION TO [username];(方括号不能少) - 如果导入涉及跨数据库引用,还需对目标库执行:
USE target_db; GRANT VIEW DEFINITION TO [username]; - 不要依赖
db_datareader角色——它不包含VIEW DEFINITION,只管用户表数据读取 - 检查是否启用了
TRUSTWORTHY数据库选项(不推荐开启),有些旧脚本会依赖它绕过权限检查,但现代环境应避免
权限配置后仍失败?重点检查 host 和 authentication plugin
MySQL 8.0+ 默认用 caching_sha2_password 插件,但部分老客户端(尤其是命令行 mysql 客户端旧版本)无法正确处理权限协商,表现为“明明授了权却说没权限”。PostgreSQL 和 SQL Server 虽无此问题,但 MySQL 的 host 匹配逻辑极严格。
- 查用户实际匹配记录:
SELECT User, Host FROM mysql.user WHERE User = 'your_user';,确认Host值是'%'还是'localhost'—— 本地用127.0.0.1连接时,'localhost'不生效 - MySQL 8.0+ 若用非默认插件,可临时切回:
ALTER USER 'user'@'host' IDENTIFIED WITH mysql_native_password BY 'pass'; - SQL Server 要确认登录类型是 SQL Server 身份验证还是 Windows 身份验证,后者权限继承自域组,容易漏查
权限层级和认证方式这两块最容易被跳过,尤其当开发和运维用不同账号、不同客户端测试时,现象一致但根因不同。










