Как создать пользователя базы данных SQL Azure, который может создавать представления CREATE / ALTER / DROP, но не таблицы, может читать данные, но не может INSERT / UPDATE / DELETE / TRUNCATE? - PullRequest
5 голосов
/ 12 ноября 2019

Можно ли создать пользователя базы данных SQL Azure, который может:

  • ВЫБРАТЬ для всех таблиц и представлений
  • СОЗДАТЬ / ИЗМЕНИТЬ / УБРАТЬ представления

Но пользователь должен НЕ иметь следующие полномочия:

  • ВСТАВИТЬ / ОБНОВИТЬ / УДАЛИТЬ / УСТАНОВИТЬ ТАБЛИЦУ для любой таблицы или представления
  • СОЗДАТЬ / ИЗМЕНИТЬ /УДАЛИТЬ любую таблицу

Каковы правильные операторы для выполнения вышеуказанных требований, или это невозможно в Azure SQL?

Я пробовал приведенные ниже операторы без последнего оператора:пользователь не может создавать представления, но, добавив последний оператор, пользователь может удалить таблицы.

CREATE USER [TestUser] WITH PASSWORD=N'NAvCO_h2eMuX', DEFAULT_SCHEMA=[dbo];

CREATE ROLE [TestRole];

ALTER ROLE [TestRole] ADD MEMBER [TestUser];

ALTER ROLE [db_datareader] ADD MEMBER [TestRole];

GRANT CREATE VIEW TO [TestRole];

GRANT SELECT ON SCHEMA :: dbo TO [TestRole];

GRANT ALTER ON SCHEMA :: dbo TO [TestRole];

Ответы [ 2 ]

2 голосов
/ 12 ноября 2019

Когда вы запускаете ALTER ROLE [db_datareader] ADD MEMBER [TestRole] или GRANT SELECT ON SCHEMA :: dbo TO [TestRole], пользователь [TestUser] будет выполнять роль только для чтения db_datareader базы данных. Вы не можете делать какие-либо другие операции, такие как «ВСТАВИТЬ / ОБНОВИТЬ / УДАЛИТЬ против любой таблицы или представления».

Но вы добавляете разрешение ALTER к [TestUser], у пользователя оба будут права SELECT и ALTER, у пользователя будет роль, подобная db_owner. Конечно, у него есть разрешение на создание таблиц представления или удаления.

Невозможно создать пользователя базы данных SQL Azure, у которого есть разрешение только для чтения и разрешение CREATE VIEW.

Ссылка: Роли на уровне базы данных

Надеюсь, это поможет.

1 голос
/ 12 ноября 2019

В качестве обходного пути вы можете создать триггер DDL базы данных, который не позволяет этому пользователю создавать, отбрасывать или изменять какие-либо таблицы или определенные таблицы.

ALTER TRIGGER [TR_ProtectTables]
ON DATABASE
FOR DROP_TABLE, ALTER_TABLE, CREATE_TABLE
AS

DECLARE @eventData XML,
               @uname NVARCHAR(50),
               @sname NVARCHAR(100),
               @oname NVARCHAR(100),
               @otext VARCHAR(MAX),
               @etype NVARCHAR(100),
               @edate DATETIME

SET @eventData = eventdata()

SELECT
        @edate=GETDATE(),
        @uname=@eventData.value('data(/EVENT_INSTANCE/UserName)[1]', 'SYSNAME'),
        @sname=@eventData.value('data(/EVENT_INSTANCE/SchemaName)[1]', 'SYSNAME'),
        @oname=@eventData.value('data(/EVENT_INSTANCE/ObjectName)[1]', 'SYSNAME'),
        @otext=@eventData.value('data(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]', 'VARCHAR(MAX)'),
        @etype=@eventData.value('data(/EVENT_INSTANCE/EventType)[1]', 'nvarchar(100)')

IF @oname IN ('tblBananas','tblApples','tblOranges') and @uname = 'UserName'
  BEGIN
    DECLARE @err varchar(100)
    SET @err = 'Table ' + @sname + '.' + @oname  + ' is super duper protected and cannot be dropped.'
    RAISERROR (@err, 16, 1) ;
    ROLLBACK;
  END

GO

ENABLE TRIGGER [TR_ProtectTables] ON DATABASE
GO

Чтобы пользователь не мог вставить INSERT / UPDATE /УДАЛИТЕ любые данные, для которых вы можете создать роль и добавить пользователя к этой роли.

CREATE ROLE [DenyWriteOnly]

EXEC sp_addrolemember N'db_datareader', N'DenyWriteOnly'

--explicitly DENY access to writing

EXEC sp_addrolemember N'DB_DenyDataWriter', N'DenyWriteOnly'

--now add the user to the role

EXEC sp_addrolemember N'DenyWriteOnly', N'MyDomain\YourUser'

Я вижу, что вы отредактировали свой исходный вопрос и хотите также запретить таблицу усечений. Проще всего запретить пользователю усекать любую таблицу - включить сбор данных об изменении, но эта функция доступна для управляемого экземпляра Azure.

Если у вас нет управляемого экземпляра Azure, решение будет более сложным, посколькуминимальное разрешение, требуемое для TRUNCATE, - ALTER. Другими вариантами являются создание таблиц для участия в репликации транзакций, включение таблиц в индексированные представления или создание пустой таблицы просто с целью создания фиктивного внешнего ключа для каждой таблицы, ссылающейся на пустую таблицу.

...