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
BUSINESS DATABASE
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);