限制对单个数据库中不同模式的访问的最佳方法
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="data source=.;initial catalog=APADataBase;user id=AccountingDataBaseLogin;password=AccountingDataBaseLoginPassword;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
我想知道我正在做的事情是否是实现我想要的最好方法,如果不是,那更好的方法是什么?
您可以直接向架构授予权限:
GRANT SELECT, INSERT, UPDATE, DELETE ON SCHEMA::Accounting TO AccountingDataBaseUser;
如果您有多个用户需要访问同一个模式,您可以创建一个数据库角色并授予角色上述权限。然后将用户添加到角色。
这是您 objective 的合理实施。特别是,您没有犯 dbo
拥有架构并允许其他用户在其中创建对象的常见错误。
您的模型的一些可能改进是
1) 让角色拥有架构而不是用户
2) 为模式所有者拥有一个角色,为应用程序拥有另一个没有 DDL 权限的角色
在 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="data source=.;initial catalog=APADataBase;user id=AccountingDataBaseLogin;password=AccountingDataBaseLoginPassword;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
我想知道我正在做的事情是否是实现我想要的最好方法,如果不是,那更好的方法是什么?
您可以直接向架构授予权限:
GRANT SELECT, INSERT, UPDATE, DELETE ON SCHEMA::Accounting TO AccountingDataBaseUser;
如果您有多个用户需要访问同一个模式,您可以创建一个数据库角色并授予角色上述权限。然后将用户添加到角色。
这是您 objective 的合理实施。特别是,您没有犯 dbo
拥有架构并允许其他用户在其中创建对象的常见错误。
您的模型的一些可能改进是
1) 让角色拥有架构而不是用户
2) 为模式所有者拥有一个角色,为应用程序拥有另一个没有 DDL 权限的角色