我有一个需要保护的与工资单相关的架构。我想如果我阻止所有用户直接修改表,并创建一组程序来处理所有数据修改,我们应该处于良好状态。我可以让程序处理所有审计日志,根据需要将事物包装在事务中,等等。
但要做到这一点,我需要拒绝对这个特定模式上的每个人的直接 DML 语句——甚至是 sysadmin 服务器角色。有没有任何简单的方法可以做到这一点而不诉诸 INSTEAD OF 触发器(这不会像防弹一样)?我没有看到像“DENY INSERT, UPDATE, DELETE ON SCHEMA::schemaname TO ALL”这样的语法,并且拒绝“public”角色的权限似乎没有达到预期的效果。
如果所有数据访问都是通过存储过程进行的,则不会检查表上的权限是否由同一用户(可能是 dbo)同时拥有过程和表。这称为所有权链接
这也意味着根本不需要对表的权限。您不需要拒绝或授予表上的任何内容,因为它们不会被检查。缺少 GRANT 意味着无论如何都没有权利,所以你不需要 DENY
现在,这对具有提升权限的人来说毫无意义:sysadmin、db_owner 等。这些将始终拥有权限。您只能使用触发器来阻止这些:但它们当然可以禁用或删除触发器。
我假设您的“最终用户”没有以 db_owner 或 sysadmin 身份运行...