Лучший способ ограничить доступ к различным схемам в одной базе данных - PullRequest
1 голос
/ 15 января 2020

В SQL Server я хочу создать базу данных с несколькими Schemas, каждая из которых относится к конкретному c Domain моего приложения.

Я также хотел бы создать ограниченную Доступ к каждой схеме означает, что когда пользователь входит в базу данных (из ssms или из entityframework внутри приложения), он / она может получить доступ только к объектам в базе данных с одной указанной c схемой, которую он / она имеет доступ и также может выполнять все команды 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

В моем приложении я создаю отдельную .edmx файл для каждого Schema, и мне потребуется отдельная строка подключения для каждого .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" />

Я хотел бы знать, является ли то, что я делаю, лучшим способом для достижения того, что Я хочу, а если нет, то что будет лучше?

Ответы [ 2 ]

2 голосов
/ 15 января 2020

Вы можете предоставить разрешения для схемы напрямую:

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

Если у вас есть несколько пользователей, которым требуется доступ к одной и той же схеме, вы можете создать роль базы данных и предоставить вышеуказанные разрешения для этой роли. Затем добавьте пользователей к роли.

1 голос
/ 16 января 2020

Это разумная реализация вашей цели. В частности, вы не совершили типичную ошибку, имея схему, которой владеет dbo, и позволяя другим пользователям создавать объекты в ней.

Пара возможных улучшений вашей модели:

1) иметь роль, владеющую схемой вместо пользователя

2) иметь одну роль для владельца схемы, а другую - без прав DDL для приложения

...