【问题标题】:Best way to restrict access to different schemas in a single database限制对单个数据库中不同模式的访问的最佳方法
【发布时间】:2020-01-15 18:21:18
【问题描述】:

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

我还想创建对每个模式的受限访问,这意味着当用户登录数据库时(从ssms 或从entityframework 内部应用程序)他/她只能访问数据库中的对象使用他/她可以访问的一个特定架构,并且还可以使用该架构执行所有 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" />

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

【问题讨论】:

    标签: sql sql-server entity-framework database-administration


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      您的模型有几个可能的改进

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

      2) 一个角色是架构所有者,另一个角色是应用程序没有 DDL 权限

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-11-19
        • 1970-01-01
        • 2011-02-24
        • 1970-01-01
        • 2011-08-19
        • 2012-03-18
        • 1970-01-01
        相关资源
        最近更新 更多