#azure #azure-powershell #azure-sql-server
Вопрос:
У нас есть команда, владеющая подпиской на Azure, и часто нам нужны билеты на обслуживание, чтобы скопировать базу данных из производственной подписки в подписку для разработчиков. Как разработчику, нам разрешено иметь доступ (роль читателя) к данным, но не через роль участника в prod. Было предложено, чтобы разработчики имели специальные разрешения, позволяющие им просто копировать. Но не похоже, что есть роль, которая в некотором смысле остается «читателем», но которой достаточно разрешено копировать. Технически, в этом случае разработчики ничего не изменят в prod. Они должны иметь возможность копировать только в другую подписку, в которой у них есть роль участника
Ищете решение, которое позволяет разработчику копировать базу данных, но не предоставляет никаких дополнительных прав на производственные подписки. Один из способов, который я мог бы придумать, — это создать размещенную утилиту на основе C#, которая запускает PowerShell под данной учетной записью службы, и эта программа может быть запущена вызовом API. Разработчикам может быть разрешено выполнять вызов API.
Я не эксперт по Azure, поэтому не уверен, что приведенное выше решение является излишним. Существуют ли другие простые способы достижения этой цели.
Комментарии:
1. Вы хотите скопировать только один раз или потребуется последующий процесс копирования?
Ответ №1:
К сожалению, портал Azure, PowerShell и интерфейс командной строки Azure не поддерживают копирование базы данных в другую подписку.
Вы можете использовать T-SQL для копирования базы данных на сервер в другой подписке. Убедитесь, что вы используете логин с тем же именем и паролем, что и владелец базы данных исходной базы данных. Кроме того, имя входа должно быть членом dbmanager
роли или администратором сервера как на исходном, так и на целевом серверах.
--Step# 1
--Create login and user in the master database of the source server.
CREATE LOGIN loginname WITH PASSWORD = 'xxxxxxxxx'
GO
CREATE USER [loginname] FOR LOGIN [loginname] WITH DEFAULT_SCHEMA=[dbo];
GO
ALTER ROLE dbmanager ADD MEMBER loginname;
GO
--Step# 2
--Create the user in the source database and grant dbowner permission to the database.
CREATE USER [loginname] FOR LOGIN [loginname] WITH DEFAULT_SCHEMA=[dbo];
GO
ALTER ROLE db_owner ADD MEMBER loginname;
GO
--Step# 3
--Capture the SID of the user "loginname" from master database
SELECT [sid] FROM sysusers WHERE [name] = 'loginname';
--Step# 4
--Connect to Destination server.
--Create login and user in the master database, same as of the source server.
CREATE LOGIN loginname WITH PASSWORD = 'xxxxxxxxx', SID = [SID of loginname login on source server];
GO
CREATE USER [loginname] FOR LOGIN [loginname] WITH DEFAULT_SCHEMA=[dbo];
GO
ALTER ROLE dbmanager ADD MEMBER loginname;
GO
--Step# 5
--Execute the copy of database script from the destination server using the credentials created
CREATE DATABASE new_database_name
AS COPY OF source_server_name.source_database_name;