编程SQL 架构师

有哪些方法可以通过 SQL 中的权限和角色保护数据免受意外或恶意更改?访问级别有什么不同,如何正确实现多级安全策略?

用 Hintsage AI 助手通过面试

答案。

SQL 服务器通过 角色用户权限 (GRANT/REVOKE) 和模式 (schemas) 支持多级访问控制系统。关键原则:

  • 分配 角色 = 一组权限,用户随后将获得这些权限。
  • 只授予最低限度的权限,仅提供必要的权限(最小特权原则)。
  • 在数据库、表、视图和过程级别分别划分权限。
  • 对于特别重要的操作 — 应仅通过存储过程或视图使用,而不是直接访问表。

创建角色和分配权限的示例:

-- 创建分析师角色 CREATE ROLE Analyst; -- 仅授予所需表的 SELECT 权限 GRANT SELECT ON Sales TO Analyst; -- 禁止修改数据 REVOKE INSERT, UPDATE, DELETE ON Sales FROM Analyst; -- 将角色分配给用户 GRANT Analyst TO user_ivan;

通常会划分读取(只读)、修改、管理和单独操作的角色。

设问陷阱。

陷阱: “只有访问视图 (VIEW) 的用户能通过它更改基础表吗?请举例说明。”

回答: 可以,如果 VIEW 不包含聚合/分组且不是仅用于读取 (WITH CHECK OPTION) - 可以在 VIEW 上执行 INSERT/UPDATE/DELETE,且更改将影响基础表,只要权限允许。

-- 视图,剔除多余的列 CREATE VIEW SalesAsView AS SELECT id, total, manager_id FROM Sales; -- 如果被允许,用户将这样进行更改: UPDATE SalesAsView SET total=1000 WHERE id=42; -- 这将影响 Sales.total 对于 id=42

解决方案:仅使用只读 VIEW 或禁止通过视图修改数据的权限。

真实错误示例由于对主题细节的不了解。


事件

项目: HR 门户,员工个人数据。

错误: 操作员通过 VIEW 访问基础表而没有更新限制 — 偶然修改了彼此的薪水,尽管最初 VIEW 设计为“仅用于报告”。



事件

项目: 会计,外部集成。

错误: 将外部系统对整个数据库授予了 INSERT 和 SELECT 权限,而不是仅对所需表授予 INSERT 权限。最终结果:对整个数据库的读取脆弱性和可能违反 GDPR 法规。



事件

项目: SaaS 平台,多用户报告。

错误: 所有客户在一个模式中工作,具有共享权限:偶然看到并能够编辑他人数据。解决方案 — 按模式划分、单独的角色和在行级安全性 (RLS) 级别的自定义限制。