限制对单个数据库中不同模式的访问的最佳方法

Best way to restrict access to different schemas in a single database

SQL Server 中,我想创建一个包含多个 Schemas 的数据库,每个数据库都与我的应用程序的特定 Domain 相关。

我还想创建对每个模式的限制访问,这意味着当用户登录数据库时(从 ssms 或从 entityframework 应用程序内部)he/she只能访问具有一个特定模式的数据库中的对象 he/she 可以访问并且还可以使用该模式执行所有 ddl/dml 命令。

我想出了以下解决方案:

1- 创建数据库登录

CREATE LOGIN [AccountingDataBaseLogin] WITH PASSWORD='AccountingDataBaseLoginPassword'

2- 为步骤 1 中创建的登录创建数据库用户。

CREATE USER [AccountingDataBaseUser] FOR LOGIN [AccountingDataBaseLogin]

3- 创建架构:

    BEGIN
        EXECUTE('CREATE SCHEMA Accounting  AUTHORIZATION AccountingDataBaseUser')
        ALTER USER AccountingDataBaseUser WITH DEFAULT_SCHEMA = Accounting
        ALTER AUTHORIZATION ON SCHEMA::Accounting TO AccountingDataBaseUser;
        GRANT CREATE TABLE TO AccountingDataBaseUser;
        GRANT CREATE VIEW TO AccountingDataBaseUser;
        GRANT CREATE PROCEDURE TO AccountingDataBaseUser;
        GRANT CREATE TYPE TO AccountingDataBaseUser;
        GRANT CREATE FUNCTION TO AccountingDataBaseUser;
        GRANT CREATE DEFAULT TO AccountingDataBaseUser;
    END

在我的应用程序中,我为每个 Schema 创建了一个单独的 .edmx 文件,我必须为每个 .edmx 创建一个不同的连接字符串,如下所示:

<add name="AccountingDataBaseEntities" connectionString="metadata=res://*/ModelDesigners.Accounting.AccountingDataBaseModel.csdl|res://*/ModelDesigners.Accounting.AccountingDataBaseModel.ssdl|res://*/ModelDesigners.Accounting.AccountingDataBaseModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=.;initial catalog=APADataBase;user id=AccountingDataBaseLogin;password=AccountingDataBaseLoginPassword;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />

我想知道我正在做的事情是否是实现我想要的最好方法,如果不是,那更好的方法是什么?

您可以直接向架构授予权限:

 GRANT SELECT, INSERT, UPDATE, DELETE ON SCHEMA::Accounting TO AccountingDataBaseUser;

如果您有多个用户需要访问同一个模式,您可以创建一个数据库角色并授予角色上述权限。然后将用户添加到角色。

这是您 objective 的合理实施。特别是,您没有犯 dbo 拥有架构并允许其他用户在其中创建对象的常见错误。

您的模型的一些可能改进是

1) 让角色拥有架构而不是用户

2) 为模式所有者拥有一个角色,为应用程序拥有另一个没有 DDL 权限的角色