Dynamics AX 2012 : Permissions SQL pour le compte AOS

Il arrive parfois que vous vouliez rafraîchir votre environnement UAT, TEST ou DEV avec une copie de PROD. Une méthode utilisée couramment est de prendre une sauvegarde des bases de données AX (Business et Model Store) de production et de faire une restauration des bases de données dans un autre environnement. Toutefois, il se peut que le compte de service AOS dans votre environnement TEST ne soit pas le même que PROD. Conséquemment, vous obtenez en erreur lorsque vous démarrez le service AOS TEST puisque le compte service n'a pas accès aux bases de données que vous venez de restaurer.

Il existe un script, mais il a été écrit en 2011 (donc probablement pour Dynamics AX 2012 RTM) et n'est pas compatible avec Dynamics AX 2012 R3. J'ai donc fait mon propre script simplifié. Ce code fonctionne seulement avec Dynamics AX 2012 R3 et seulement pour la base de données "Business". Vous devez utiliser Grant-AXModelStore pour la base de données "Model Store".

MODEL DATABASE

Grant-AXModelStore -AOSAccount domain\aosaccount -Database MicrosoftDynamicsAX_model -Server servername\instancename


BUSINESS DATABASE

USE [MicrosoftDynamicsAXDatabaseName]  
DECLARE @AOSAccount AS varchar (40)  
DECLARE @AXDBName AS varchar (40)  
DECLARE @SQL AS varchar (250)  
   
SET @AOSAccount = 'domain\username';  

SET @AXDBName = 'DatabaseName'


IF not exists(select * from sys.server_principals where name = @AOSAccount) 
BEGIN 
SET @SQL = 'CREATE LOGIN ['+@AOSAccount+'] FROM WINDOWS WITH DEFAULT_DATABASE=['+@AXDBName+']'
EXECUTE (@SQL) 
END  

IF not exists(select * from sys.database_principals where name = @AOSAccount)  
BEGIN  
SET @SQL = 'CREATE USER ['+@AOSAccount+'] FOR LOGIN ['+@AOSAccount+'] WITH DEFAULT_SCHEMA=dbo';  
EXECUTE(@SQL);  
END  

SET @SQL = 'ALTER ROLE [db_datareader] ADD MEMBER ['+@AOSAccount+']';  
EXECUTE(@SQL);    

SET @SQL = 'ALTER ROLE [db_datawriter] ADD MEMBER ['+@AOSAccount+']';  
EXECUTE(@SQL); 
   
SET @SQL = 'ALTER ROLE [db_ddladmin] ADD MEMBER ['+@AOSAccount+']'
EXECUTE(@SQL); 
  
SET @SQL = 'GRANT EXECUTE ON [dbo].[CREATESERVERSESSIONS] TO ['+@AOSAccount+']'
EXECUTE(@SQL); 
  
SET @SQL = 'GRANT EXECUTE ON [dbo].[CREATEUSERSESSIONS] TO ['+@AOSAccount+']'
EXECUTE(@SQL); 
  
SET @SQL = 'GRANT EXECUTE ON [dbo].[getNumInternal] TO ['+@AOSAccount+']'
EXECUTE(@SQL); 
  
SET @SQL = 'GRANT EXECUTE ON [dbo].[sp_AddBIAnalysisServer] TO ['+@AOSAccount+']'
EXECUTE(@SQL); 
  
SET @SQL = 'GRANT EXECUTE ON [dbo].[sp_AddReportServer] TO ['+@AOSAccount+']'
EXECUTE(@SQL); 
  
SET @SQL = 'GRANT EXECUTE ON [dbo].[sp_GetNextRecId] TO ['+@AOSAccount+']'
EXECUTE(@SQL); 
  
SET @SQL = 'GRANT CONTROL ON SCHEMA::[dbo] TO ['+@AOSAccount+']'
EXECUTE(@SQL); 

SET @SQL = 'GRANT SHOWPLAN TO ['+@AOSAccount+']';
EXECUTE(@SQL); 

TEMPDB DATABASE


USE [tempdb] 
  
DECLARE @AOSAccount AS varchar (20) 
DECLARE @SQL AS varchar (250) 
  
SET @AOSAccount = 'domain\username'
  
IF not exists(select * from sys.database_principals where name = @AOSAccount) 
BEGIN 
SET @SQL = 'CREATE USER ['+@AOSAccount+'] FOR LOGIN ['+@AOSAccount+']'
EXECUTE(@SQL); 
END 
  
SET @SQL = 'ALTER ROLE [db_datareader] ADD MEMBER ['+@AOSAccount+']'; 
EXECUTE(@SQL); 
  
SET @SQL = 'ALTER ROLE [db_datawriter] ADD MEMBER ['+@AOSAccount+']'
EXECUTE(@SQL); 
  
SET @SQL = 'ALTER ROLE [db_ddladmin] ADD MEMBER ['+@AOSAccount+']'
EXECUTE(@SQL);  
  
SET @SQL = 'GRANT CONTROL TO ['+@AOSAccount+']'
EXECUTE(@SQL);

Previous
« Prev Post