繁体   English   中英

“真正的”数据库授予用户什么权限?

[英]What permissions to 'real' databases grant users?

在阅读@ PerformanceDBA对历史/可审计数据库的回答时,他发表了这样的声明:

在实际(标准ISO / IEC / ANSI SQL)数据库中,我们不向用户授予INSERT INSERT / UPDATE / DELETE权限。 我们只授予SELECT和REFERENCES(对于选定的用户)所有INSERT / UPDATE / DELETE都在Transactions中编码,这意味着存储过程。 然后我们在每个存储过程中向所选用户授予EXEC(使用ROLES来减少管理)。

这是真的? 如何动态生成INSERT / UPDATE的ORM工具?

UPDATE

好的,所以这是一个例子。 我有一个带有两个界面的Web应用程序,一个Admin和一个User 管理员端使用繁重的 ORM,能够动态生成数百个(如果不是数千个)不同的SQL命令。

用户交互要简单得多,我有十几个SP可以处理任意UPDATE / INSERT几个投票按钮。 显然,运行应用程序的用户具有非常不同的权限集。 在管理方面,ORM的DB用户对相关表具有完全CRUD访问权限,此应用程序根本没有使用SP - 我不会想到在没有通过域模型中的业务逻辑的情况下触摸数据。 甚至批量数据导入也通过ORM进行处理。 用户方面的SP我认为这个原则只是一个小小的让步,因为它们是如此特殊的情况。

现在,我发现原始问题中的上述陈述有点令人不安,因为我认为这是一个“真正的”数据库,或者至少接近它。

我会说这是最好的设计,我通常喜欢练习。 因为来自应用程序的即席查询可能很混乱,难以调整,甚至更难以进行故障排除和跟踪,所以使用存储过程获取抽象级别是最容易的。 应用程序只能进行存储过程调用。 将存储过程视为数据库的API。

因此,如果以上是设计目的,那么应用程序用户只需要对数据库进行SELECTEXECUTE 这就是为什么:

create procedure MyTestProcedure
with execute as 'UserWithDMLRights'
as

    -- your CRUD code

go

如果典型的应用程序用户只有SELECTEXECUTE ,那么执行上述存储过程的权限就足够了。 存储过程中的INSERT/UPDATE/DELETE将在UserWithDMLRights的安全上下文中UserWithDMLRights ,并且该数据库用户必须具有INSERT/DELETE/UPDATE权限。

至于ORM,我很同意你。 我相信L2S只是使用sp_executesql进行了大量的即席查询调用,所以我相信你会遇到一个问题并使用上述安全实践。

它像狂欢节中的格兰帕一样j。 ORM可以使用SP,但它没有充分利用它们。

SP只是生活的方式,它就像第十一条诫命一样,但正如你指出的那样,ORM并没有真正起作用。 我曾经认为整个SP层本身就是一种预制的ORM,你带走了你的关系数据库,做了一堆连接并返回了一组数据,其中包含填充对象所需的列/属性。

现在,对于动态ORM类型的应用程序,需要在表上指定权限,如果您的DBA正在执行其工作,那就不那么安全了,它只需要更多工作,并且需要有更多关于表允许的内容的通信,如果您不需要DELETE,那么您的DBA需要知道不为其授予权限。

良好的DBA知道具有表访问权限的安全数据库与仅具有SP访问权限的数据库一样安全。 相信不那么自信的DBA更难以解决问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM