我目前正在开发一个基础架构,它允许我们为多个应用程序提供单个数据库,它们共享一组公共实体(表)。每个模式都通过ORM映射到一组域对象。
我们的想法是拥有一个管理类型应用程序来管理公共实体集。每个其他应用程序都有自己的架构,但它只能读取公共集中的实体。由于这些应用程序中的每个应用程序都拥有自己的数据库登录和架构所有权,因此最初会导致公共架构授予对所有这些登录的只读权限。
也许为了简单起见,我们有以下三种模式:
和申请:
管理员应用:
申请表A:
申请表B:
上述方案非常简单:在模式Common上添加SELECT权限,以登录A和B.
但是我现在想要授予Application A权限INSERT,DELETE,UPDATE模式Common中的特定表。为了清楚起见,我们假设我们有一个名为Files的表,任何应用程序都可以插入。
我设法完成此任务的唯一方法是授予登录A所有这些架构权限。如果我只通过Common模式中的表文件赋予它那些权限,那么它将在运行时被拒绝。 Hover执行此操作现在授予登录A对架构中所有表的所有权限 - 这是不太理想的。
如何或在何处授予所需的权限,以便它仅适用于特定的表?
答案 0 :(得分:2)
首先:您可以为各个表授予权限,请参阅GRANT Object Permissions中的第一个示例:
GRANT SELECT ON OBJECT::Person.Address TO RosaQdM;
因此,您可以简单地将Common.Files
和User A
上的特定表User B
的INSERT / UPDATE / DELETE权限授予(他们是用户,而不是登录,因为您正在谈论关于database principals)。
建议的解决方案最长时间是拥有一组控制访问权限的存储过程,并授予EXECUTE和那些存储过程。见Managing Permissions with Stored Procedures in SQL Server。您可以让ORM使用这些存储过程而不是原始表访问。这适用于写操作,但是对于允许将任意查询推送到数据库(例如LINQ)的ORM,读取不起作用,因为存储过程输出结果集不能像直表一样进行操作。但是,由于您的布局允许R / O访问Common模式,因此您可以将其用于所有SELECT,并仅将存储过程用于写入操作。
因此,您可以使用这两种解决方案中的任何一种,或者授予对表的写入权限,或者使用存储过程并对它们授予EXECUTE权限。存储过程添加一层验证并强制应用程序在使用表时遵守某个API(例如,他们不能执行DELETE FROM Common.Files
并擦除整个表)。另一方面,直接访问表以进行写入更容易在ORM中使用。