我正在尝试使用二头肌来复制以下场景:
就目前情况而言,一旦部署了基础设施,我们就必须使用 SSMS 或类似的工具来添加相关角色:
CREATE USER [functioName] FROM EXTERNAL PROVIDER
ALTER ROLE db_datareader ADD MEMBER [functionName]
我一直在研究一种在二头肌本身内执行此操作的方法,但无法使其工作,我尝试创建具有贡献者角色的用户管理身份,并在包含 powershell 的部署脚本中使用该身份来运行 InvokeSQL反对 dB 但遇到错误。
我不确定这是否是正确的方法,或者这在二头肌中是否可行,所以任何指导将不胜感激。
我们也为此苦苦挣扎。您可以将基础设施和软件的部署作为两个独立的事情来处理。 然后,您可以选择将数据库迁移作为软件部署管道的一部分。然后,将 sql 用户/角色添加为软件部署的一部分(而不是基础设施部署的一部分)只是一小步。
您可以创建一个如下所示的文件
assign-user-roles.sql
:
IF NOT EXISTS(SELECT 1 FROM sys.database_principals WHERE name = '<placeholder-for-userid>')
BEGIN
CREATE USER [<placeholder-for-userid>] FROM EXTERNAL PROVIDER
ALTER ROLE db_datareader ADD MEMBER [<placeholder-for-userid>]
ALTER ROLE db_datawriter ADD MEMBER [<placeholder-for-userid>]
END
请注意,您需要
IF NOT EXISTS
,因为您必须仅在用户已存在的情况下创建该用户,否则管道将失败。
软件部署管道 (Azure DevOps) 的一部分应包含以下内容:
- powershell: |
(Get-Content $(Build.SourcesDirectory)/pipelines/assign-user-roles.sql -Encoding UTF8).Replace('<placeholder-for-userid>', '${{ parameters.appName }}') |
Set-Content $(Build.SourcesDirectory)/pipelines/assign-user-roles.sql
displayName: 'Add name of managed identity to sql script'
- task: SqlAzureDacpacDeployment@1
displayName: Assign roles to users in database
inputs:
azureSubscription: ${{ parameters.azureSubscription }}
AuthenticationType: 'servicePrincipal'
ServerName: ${{ parameters.fqnSqlServer }}
DatabaseName: ${{ parameters.db }}
deployType: 'SqlTask'
SqlFile: '$(Build.SourcesDirectory)/pipelines/assign-user-roles.sql'
IpDetectionMethod: 'AutoDetect'
关于安全:
azureSubscription
)需要 sql 数据库中的权限才能创建用户/角色EXTERNAL PROVIDER
(本例中为 Entra ID)读取用户信息。如果您想为 sqlServer 身份赋予此角色作为基础设施部署管道的一部分,您应该考虑将其添加到具有此角色的组中,而不是直接将该角色分配给该身份。