精通 DCL:SQL 中 GRANT 与 REVOKE 的终极指南

发布: (2026年2月28日 GMT+8 22:13)
5 分钟阅读
原文: Dev.to

Source: Dev.to

引言

如果你从事数据库工作——无论是软件工程、数据科学,还是在金融行业管理关键业务数据库——你都知道安全不是可选项。你不能随便让任何用户在生产环境中删除表,对吧?

这时 DCL(数据控制语言)就派上用场了。DML 用来操作数据,DDL 用来定义结构,而 DCL 则是数据库的门卫。它决定谁可以进入、可以去哪里以及可以做什么。

今天,我们将拆解这个类别中两条绝对强大的命令:GRANTREVOKE

黄金法则:基本结构

DCL 的美妙之处在于其语法高度逻辑化。把它想象成一句直接的英文句子:

动作 + 允许/禁止的内容 + 作用对象 + 对谁/来自谁

GRANTREVOKE 都遵循完全相同的骨架。

GRANT:发放访问徽章

基本语法

GRANT [privileges] ON [table/view] TO [user];

实际示例 1 – 读取和写入权限

假设一位新加入的初级 HR 分析师需要读取数据并插入新员工,但我们不希望他们删除任何记录。

GRANT SELECT, INSERT ON HR05_EMPLOYEE TO junior_analyst;

实际示例 2 – 完全访问(God Mode)

如果你需要把对特定表的全部控制权交给高级开发者:

GRANT ALL PRIVILEGES ON HR05_EMPLOYEE TO senior_dev;

专业提示:WITH GRANT OPTION

如果你希望用户不仅获得权限,还能将其转授给其他人怎么办?使用 WITH GRANT OPTION。这在将模式管理委派给技术负责人时很常见。

GRANT SELECT ON SALES_TABLE TO tech_lead WITH GRANT OPTION;

REVOKE:收回徽章

基本语法

REVOKE [privileges] ON [table/view] FROM [user];

(注意我们从 TO 换成了 FROM。你向某人 grant,而 revoke 则是从某人撤回。)

实际示例 1 – 精准剥夺权限

假设用户 HR5678 犯了错误,不能再拥有删除员工表行的权限,但仍需能够查询和插入数据。我们只剥夺 DELETE 权限:

REVOKE DELETE ON HR05_EMPLOYEE FROM HR5678;

实际示例 2 – 一刀切撤销

如果员工调岗或系统被攻破,我们一次性撤销所有权限:

REVOKE ALL PRIVILEGES ON HR05_EMPLOYEE FROM HR5678;

级联效应(CASCADE vs RESTRICT)

还记得 WITH GRANT OPTION 吗?如果技术负责人把权限授予了 5 位实习生,而你撤销了技术负责人的访问权限,实习生会怎样?

在许多 DBMS(如 Oracle)中,撤销默认会产生级联效应。根节点失去权限时,所有通过它获得权限的分支也会失去相同权限。

最佳实践:最小特权原则(PoLP)

在真实环境(以及良好架构)中,我们从不“以防万一”随意授予权限。黄金法则是 最小特权原则:用户只能拥有完成工作所绝对必要的权限,不能多余。

  • 为 PowerBI 仪表板或数据科学提取数据?数据库连接用户只需要 GRANT SELECT
  • Web 应用需要更新客户注册信息?GRANT UPDATE

这样,即使密码泄露或代码写得不佳,影响范围也会被限制在 DCL 的“围栏”之内。

0 浏览
Back to Blog

相关文章

阅读更多 »

SQL 连接和窗口函数

markdown !Musungu Ruth Ambogohttps://media2.dev.to/dynamic/image/width=50,height=50,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws...

SQL 连接和窗口函数

SQL 连接和窗口函数 !tonny otieno https://media2.dev.to/dynamic/image/width=50,height=50,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uplo...