Удаление SSDT и воссоздание разрешений при развертывании на Azure в качестве пользователя базы данных - PullRequest
2 голосов
/ 02 марта 2020

У нас есть проект SSDT, который включает пользователей, роли и разрешения. Это работало очень хорошо, но недавний переход на Azure вызвал или, возможно, выдвинул на первый план проблему с развертыванием.

До Azure у некоторых участников проекта был пользователь на главной базе данных с достаточными разрешениями публиковать sh базы данных. В Azure SQL Db есть только один пользователь-администратор, и эти учетные данные не должны использоваться совместно. Поэтому вместо этого мы решили использовать достаточно разрешенных пользователей базы данных для публикации sh. Это не работает для разрешений, предоставленных схемам и типам.

В качестве примера, скажем, у нас есть следующее в нашем проекте:

CREATE USER Bob;
CREATE ROLE WhatARole;
ALTER ROLE WhatARole ADD member Bob;

CREATE PROCEDURE dbo.DoStuff
AS SELECT 1;
GO
GRANT EXECUTE ON OBJECT::dbo.DoStuff TO WhatARole AS dbo; // <-- works fine

CREATE TYPE dbo.SomeType AS TABLE
(
     Name varchar(50) NOT NULL
);
GO
GRANT EXECUTE ON TYPE::dbo.SomeType TO WhatARole AS dbo; // <-- doesn't work well

CREATE SCHEMA Blah;
GO
GRANT SELECT ON SCHEMA::Blah TO WhatARole AS dbo; // <-- also doesn't work well

Проблема в публикации sh Воспроизведение при предоставлении разрешений на схемы и типы. Без каких-либо изменений проекта с момента последнего развертывания сценарий publi sh отменяет разрешения и затем предоставляет их снова, без видимой причины. (Это делалось и с разрешениями на объекты, но мы обнаружили, что можем предотвратить это, указав as dbo после каждого предоставления). Это добавляет много шума и оттока к каждому развертыванию базы данных, чего мы хотим избежать. И это не произойдет, если я использую Azure SQL Логин администратора сервера для публикации sh.

Любая помощь высоко ценится. Какие типы пользователей с какими разрешениями люди используют для публикации sh из SSDT в Azure SQL Db, когда роли и разрешения включены в проект?

ОБНОВЛЕНИЕ

Пример пользователя, который аутентифицируется в базе данных , используемой для публикации, которая видит, что разрешения на типы и схемы без необходимости удаляются и воссоздаются в каждой публикации sh:

CREATE USER OpsPerson1
    WITH PASSWORD = 'some password';
GO
ALTER ROLE db_owner add member OpsPerson1;

Я пытался сделать несколько вещей, чтобы заставить его работать, например, указав схему по умолчанию, добавив пользователя в db_ddladmin и db_securityadmin, но без кубиков.

...