Páginas

Mostrando postagens com marcador SQL. Mostrar todas as postagens
Mostrando postagens com marcador SQL. Mostrar todas as postagens

Como executar um restore database via query no SQL Server

Recentemente tive problemas com o restore do SQL Server que deu um erro e não estava conseguindo restaurar um backup de uma base de projetos na base de desenvolvimento, conversando com meu amigo DBA Sandro Bichbich ele me mostrou uma maneira de criar uma query que faz o restore (bem mais rápido por sinal que a ferramenta do próprio SQL Server).

Ao invés de utilizarmos a ferramenta nativa do SQL:


Podemos criar uma query que faça esse trabalho, porém é importante que essa query não esteja sendo executada na database que estamos utilizando para ser restaurada, para isso vamos utilizar a database master.

Agora vamos executar o seguinte código:

RESTORE FILELISTONLY from disk = 'Local onde se encontra o backup'

Feito isso vamos pegar o resultado do LogicalName para criar o seguinte código:


RESTORE DATABASE [Base a ser restaurada] FROM DISK = 'Local onde se encontra o backup'

WITH  FILE = 1,  NOUNLOAD ,  STATS = 1,  RECOVERY , 
move 'NomeLógico'   to 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\BaseASerRestaurada.mdf',
move 'NomeLógico_log'   to 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\BaseASerRestaurada_log.LDF',
REPLACE
Go

No meu caso o resultado ficou assim:

RESTORE FILELISTONLY from disk = 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Backup\DynamicsAX_Proj.bak'

RESTORE DATABASE [DynamicsAX_Dev] FROM DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Backup\DynamicsAX_Proj.bak'

WITH  FILE = 1,  NOUNLOAD ,  STATS = 1,  RECOVERY , 
move 'DynamicsAx_Proj'   to 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\DynamicsAx_Dev.mdf',
move 'DynamicsAx_Proj_log'   to 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\DynamicsAx_Dev_log.LDF',
REPLACE
Go

[]'s
Alexssander

Como criar uma conexão entre o SQL e o Dynamics AX

Eu estou trabalhando em uma migração de dados um tanto extensa, mas ao invés de trabalhar exportando dados do antigo sistema para um arquivo e importando o mesmo para o AX, decidimos criar uma conexão direta com o SQL, ler as informações e importá-las para o AX. Meu amigo ucraniano que trabalha comigo Kirill Val me deu as instruções e depois da primeira classe o resto é brincadeira de criança. Gostaria de que caso alguém tenha alguma sugestão de melhoria, por favor envie.

Criei uma classe chamada AXImport e no método classDeclaration() eu declaro duas variáveis, uma do tipo LoginProperty e outra do tipo ODBCConnection. Essa classe específica é usada também para update, por isso, para executá-la em batch, eu a fiz extendendo a classe RunBaseBatch, mas não é uma regra.
  1. public class AXImport extends RunBaseBatch
  2. {
  3.     LoginProperty         loginProperty;
  4.     ODBCConnection  connection;
Depois crie um método connect() que faça a conexão com o banco:
  1. void connect()
  2. {
  3.     ;
  4.     loginProperty = new LoginProperty();
  5.     loginProperty.setServer('localhost');//Endereço do server, no caso era local
  6.     loginProperty.setDatabase('DATABASE');//Nome da base, na dúvida, cheque no SQL
  7.  
  8.     connection = new ODBCConnection(loginProperty);
  9. }
Crie os métodos pack() e unpack():
  1. public container pack()
  2. {
  3.     container ret;
  4.     return ret;
  5. }

  1. public boolean unpack(container packedClass)
  2. {
  3.     boolean ret = true;
  4.     return ret;
  5. }
Agora crie um método que leia os dados do banco e os insira no AX. Só vamos criar um método que vai inserir alguns fornecedores. Como é um exemplo, só vou mandar buscar o id, nome e grupo de fornecedores. Você pode colocar quais campos você quer no select, ou usar o SELECT * FROM, mas neste caso, você vai precisar ver no SQL qual vai ser a ordem em que os campos aparecem, enquanto na primeira opção você escolhe a ordem dos campos. Saber a ordem dos campos é importante na hora de determinar qual campo do banco preencherá o campo da tabela no AX.
  1. void TransferData()
  2. {
  3.     Statement statement;
  4.     ResultSet  resultSet;
  5.     str            sql;
  6.     str            description;
  7.     SqlStatementExecutePermission perm;
  8.     VendTable      vendTable;
  9.     AxVendTable axVendTable;
  10.     VendGroupId vendGroup;
  11.     VendAccount vendAccount;
  12.     VendName    vendName;
  13.     ;
  14.     //Deve ser utilizado a sintaxe do SQL, não a do AX.
  15.     sql = "SELECT NANUM, NANAME, NAVENDG FROM TABELA_EXEMPLO";
  16.     perm = new SqlStatementExecutePermission(sql);
  17.     perm.assert();
  18.  
  19.     statement = connection.createStatement();
  20.     resultSet  = statement.executeQuery(sql);
  21.  
  22.     while (resultSet.next())
  23.     {
  24.         //Na mesma ordem do select ou, se usado o select * from, na que está no SQL
  25.         vendAccount = strrtrim(resultSet.getString(1));
  26.         vendName = strrtrim(resultSet.getString(2));
  27.         vendGroup = strrtrim(resultSet.getString(3));
  28.         vendTable = VendTable::find(vendAccount);
  29.  
  30.         if (!vendTable)
  31.         {
  32.             axVendTable = new AxVendTable();
  33.             axVendTable.parmAccountNum(vendAccount);
  34.             axVendTable.parmVendGroup(vendGroup);
  35.             axVendTable.parmName(vendName);
  36.             axVendTable.save();
  37.             info("Inserido Fornecedor: " + vendAccount);
  38.         }
  39.     }
  40.     resultSet.close();
  41.     statement.close();
  42. }
Crie o método run() que vai chamar primeiro o método da conexão e depois o da transferência de dados.
  1. public void run()
  2. {
  3.     this.connect();
  4.     this.TransferData();
  5. }
Crie o método main():
  1. static void main(Args args)
  2. {
  3.     AXImport axImport = new AXImport();
  4.     ;
  5.     if (axImport.prompt())
  6.     {
  7.         axImport.run();
  8.         info("Importação concluída");
  9.     }
  10. }
Bom, essa é a classe de exemplo, qualquer sugestão de melhoria ou críticas são bem-vindas.