Histórico da Página
...
O processo de migração do banco de dados tem como objetivo possibilitar um forma de migrar os dados que estão no ambiente Nimbus (TCloud) principal viabilizar a transferência dos dados atualmente armazenados no ambiente NIMBVS (T-Cloud), no formato Database para TCloud , para a plataforma T-Cloud, no formato Database Schema. O processo que irá.
O foco desse específico deste processo é trazer alterar a base do TOTVS Agro Multicultivo, que atualmente está a no nível de databas database com um schema padrão denomidado denominado dbo, para uma um schema diferentepersonalizado, que será nomeado nesse processo iremos nomeá-la de MULTICULTIVO, com isso conseguimos artigo como MULTICULTIVO. Este processo permitirá alterar, de forma simples transformar uma , a estrutura que está em uma um schema padrão (dbo) para um schema noeado. Também irá permissa que esse database possa receber novas produtos a nivel de schema.
Esse processo é visando o processo para o TOTVS Agro multicultivo, pois demais produtos como PIMSConnector, TOTVS Connector Client entre outros precisaram ser instalação, pois será necessário reconfigurações dos processo de integração;
...
customizado (MULTICULTIVO). Além disso, a mudança também permite que o database receba novos produtos a nível de schema, garantindo maior organização e flexibilidade, por exemplo, PIMS Connector, TOTVS Agro Connector Client (TCC), TOTVS Agro Conecta Dados (Agro Data Client), TOTVS Agro LGPD e TOTVS Agro T-Provider (provedor de segurança para Smart View e Multicultivo).
| Aviso | ||
|---|---|---|
| ||
|
A seguir, descreveremos as etapas necessárias para alterar o schema dbo para um novo schema. O processo é dividido em duas partes: a primeira será realizada no ambiente NIMBVS, e a segunda, no ambiente do T-Cloud.
1. Preparação no Ambiente NIMBVS
- Realizar um backup (export) da base do TOTVS Agro Multicultivo do ambiente atual
...
- no NIMBVS, que
...
- será importada para o ambiente do
...
- T-Cloud;
...
2
...
. Implementação no T-Cloud
- Ao realizar a importação dessa base de dados no ambiente
...
- do T-Cloud, ela já deve ser
...
- importada com um novo nome
...
- para a Database, refletindo as características de uma estrutura que passará a
...
- suportar múltiplos produtos a nível de schema;
- Após a importação da base de dados, é necessário realizar os procedimentos abaixo, que incluem a criação de um novo schema e a concessão das permissões adequadas ao usuário para acessá-lo. O usuário e o schema serão denominados como MULTICULTIVO, e o banco de dados será o TOTVS. No entanto, esses valores podem ser personalizados conforme a necessidade;
| Bloco de código | ||||||
|---|---|---|---|---|---|---|
| ||||||
-- Criação do Usuário do MULTICULTIVO
CREATE LOGIN MULTICULTIVO WITH PASSWORD = 'TOTVS@123';
-- Utilizando o Banco de Dados TOTVS
USE [TOTVS];
GO
-- Criar Usuário no Banco de Dados TOTVS
CREATE USER MULTICULTIVO FOR LOGIN MULTICULTIVO;
-- Concedendo as Permissões ao Usuário MULTICULTIVO
GRANT SELECT, INSERT, UPDATE, DELETE TO MULTICULTIVO;
GRANT CREATE TABLE TO MULTICULTIVO;
GRANT EXECUTE TO MULTICULTIVO;
GRANT CONNECT TO MULTICULTIVO;
GRANT ALTER TO MULTICULTIVO;
GRANT VIEW DEFINITION TO MULTICULTIVO;
GRANT CREATE SYNONYM TO MULTICULTIVO;
GRANT CREATE PROCEDURE TO MULTICULTIVO;
GRANT CREATE VIEW TO MULTICULTIVO;
GRANT CREATE FUNCTION TO MULTICULTIVO;
GRANT CREATE SCHEMA TO MULTICULTIVO;
--Criando o Schema e definindo o Schema Default
USE [TOTVS]
GO
CREATE SCHEMA [MULTICULTIVO] AUTHORIZATION [MULTICULTIVO]
GO
ALTER USER [MULTICULTIVO] WITH DEFAULT_SCHEMA=[MULTICULTIVO]
GO
|
Precisaremos ajustar alguns objetos antes de executar a alteração do Schema, uma vez que alguns objetos precisam ser ajustados;
Será necessário realizar ajustes na View EVENTO_EMBALAGEM. Para isso, precisaremos recriá-la, utilizando o comando abaixo. A alteração consiste na remoção da instrução WITH SCHEMABINDING, pois ela impede a modificação do schema padrão desse objeto. Essa restrição impacta diretamente na mudança de outras entidades que estão vinculadas a essa view.
| Bloco de código | ||||
|---|---|---|---|---|
| ||||
USE [TOTVS]
GO
DROP VIEW [dbo].[EVENTO_EMBALAGEM];
GO
CREATE VIEW [dbo].[EVENTO_EMBALAGEM]
AS
SELECT EM.ID_UNIDADEADM, EVT.ID_APEMBALAGEM,EVT.DT_EVENTO, EM.ID_INSUMO, EVT.ID_EVENTO_EMB,
INS.ID_GRPINSUMO, INS.ID_PRINCATIVO, EVT.ID_PERIODOSAFRA, PS.ID_SAFRA,
EQ.ID_EQUIPE, EQ.CD_EQUIPE,
APOS.ID_APORDSERVICO,
CC.ID_CCUSTO, OP.ID_OPERACAO, EVT.ID_APEMBALAGEM_EVT
FROM dbo.APEMBALAGEM_EVT EVT
JOIN dbo.APEMBALAGEM EM ON (EVT.ID_APEMBALAGEM = EM.ID_APEMBALAGEM)
JOIN dbo.EVENTO_EMB EVTEMB ON (EVT.ID_EVENTO_EMB = EVTEMB.ID_EVENTO_EMB)
JOIN dbo.INSUMO INS ON (EM.ID_INSUMO = INS.ID_INSUMO)
JOIN dbo.GRPINSUMO GRP ON (INS.ID_GRPINSUMO = GRP.ID_GRPINSUMO)
LEFT JOIN dbo.PRINCATIVO PATIV ON (INS.ID_PRINCATIVO = PATIV.ID_PRINCATIVO)
LEFT JOIN
( SELECT DISTINCT D.ID_PERIODOSAFRA, D.ID_APEMBALAGEM
FROM dbo.APEMBALAGEM_EVT D
JOIN
(SELECT D1.ID_APEMBALAGEM, MAX(D1.DT_EVENTO) DT_EVENTO
FROM dbo.APEMBALAGEM_EVT D1
WHERE D1.ID_PERIODOSAFRA IS NOT NULL
GROUP BY D1.ID_APEMBALAGEM
) D1 ON (D.ID_APEMBALAGEM = D1.ID_APEMBALAGEM AND D.DT_EVENTO = D1.DT_EVENTO)
) EVT_PERIODOSAFRA ON (EVT_PERIODOSAFRA.ID_APEMBALAGEM = EVT.ID_APEMBALAGEM)
LEFT JOIN dbo.PERIODOSAFRA PS ON (EVT_PERIODOSAFRA.ID_PERIODOSAFRA= PS.ID_PERIODOSAFRA)
LEFT JOIN dbo.SAFRA S ON (PS.ID_SAFRA = S.ID_SAFRA)
LEFT JOIN
( SELECT DISTINCT D.ID_APORDSERVICO, D.ID_APEMBALAGEM FROM dbo.APEMBALAGEM_EVT D
JOIN
(SELECT D1.ID_APEMBALAGEM, MAX(D1.DT_EVENTO) DT_EVENTO
FROM dbo.APEMBALAGEM_EVT D1
WHERE D1.ID_APORDSERVICO IS NOT NULL
GROUP BY D1.ID_APEMBALAGEM
) D1 ON (D.ID_APEMBALAGEM = D1.ID_APEMBALAGEM AND D.DT_EVENTO = D1.DT_EVENTO)
) EVT_APOS ON (EVT_APOS.ID_APEMBALAGEM = EVT.ID_APEMBALAGEM)
LEFT JOIN dbo.APORDSERVICO APOS ON (EVT_APOS.ID_APORDSERVICO= APOS.ID_APORDSERVICO)
LEFT JOIN
( SELECT DISTINCT D.ID_CCUSTO, D.ID_APEMBALAGEM FROM dbo.APEMBALAGEM_EVT D
JOIN
(SELECT D1.ID_APEMBALAGEM, MAX(D1.DT_EVENTO) DT_EVENTO
FROM dbo.APEMBALAGEM_EVT D1
WHERE D1.ID_CCUSTO IS NOT NULL
GROUP BY D1.ID_APEMBALAGEM
) D1 ON (D.ID_APEMBALAGEM = D1.ID_APEMBALAGEM AND D.DT_EVENTO = D1.DT_EVENTO)
) EVT_CCUSTO ON (EVT_CCUSTO.ID_APEMBALAGEM = EVT.ID_APEMBALAGEM)
LEFT JOIN dbo.CCUSTO CC ON (ISNULL(EVT_CCUSTO.ID_CCUSTO, APOS.ID_CCUSTO) = CC.ID_CCUSTO)
LEFT JOIN
( SELECT DISTINCT D.ID_OPERACAO, D.ID_APEMBALAGEM FROM dbo.APEMBALAGEM_EVT D
JOIN
(SELECT D1.ID_APEMBALAGEM, MAX(D1.DT_EVENTO) DT_EVENTO
FROM dbo.APEMBALAGEM_EVT D1
WHERE D1.ID_OPERACAO IS NOT NULL
GROUP BY D1.ID_APEMBALAGEM
) D1 ON (D.ID_APEMBALAGEM = D1.ID_APEMBALAGEM AND D.DT_EVENTO = D1.DT_EVENTO)
) EVT_OPERACAO ON (EVT_OPERACAO.ID_APEMBALAGEM = EVT.ID_APEMBALAGEM)
LEFT JOIN dbo.OPERACAO OP ON (ISNULL(EVT_OPERACAO.ID_OPERACAO, APOS.ID_OPERACAO) = OP.ID_OPERACAO)
LEFT JOIN
( SELECT DISTINCT D.ID_EQUIPE, D.ID_APEMBALAGEM FROM dbo.APEMBALAGEM_EVT D
JOIN
(SELECT D1.ID_APEMBALAGEM, MAX(D1.DT_EVENTO) DT_EVENTO
FROM dbo.APEMBALAGEM_EVT D1
WHERE D1.ID_EQUIPE IS NOT NULL
GROUP BY D1.ID_APEMBALAGEM
) D1 ON (D.ID_APEMBALAGEM = D1.ID_APEMBALAGEM AND D.DT_EVENTO = D1.DT_EVENTO)
) EQ_EVT ON (EQ_EVT.ID_APEMBALAGEM = EVT.ID_APEMBALAGEM)
LEFT JOIN dbo.EQUIPE EQ ON (EQ.ID_EQUIPE= ISNULL(EQ_EVT.ID_EQUIPE,APOS.ID_EQUIPE) );
GO |
Na próxima etapa, precisaremos verificar se existe uma referência à sequência na tabela APABASTEC_TMP. Para isso, execute o comando abaixo. Caso sejam encontradas informações, a instrução SQL removerá a sequência automaticamente.
Ponto de atenção: Após a conclusão do processo de migração, será necessário restabelecer a referência à sequência. Portanto, nas etapas seguintes, retornaremos a referência que foi removida.
| Bloco de código | ||||
|---|---|---|---|---|
| ||||
DECLARE @ConstraintName NVARCHAR(255);
SELECT @ConstraintName = c.name
FROM sys.default_constraints c
JOIN sys.objects o ON o.object_id = c.parent_object_id
WHERE o.name = 'APABASTEC_TMP';
IF @ConstraintName IS NOT NULL
BEGIN
EXEC('ALTER TABLE dbo.APABASTEC_TMP DROP CONSTRAINT ' + @ConstraintName);
END
ALTER TABLE dbo.APABASTEC_TMP SET (LOCK_ESCALATION = TABLE)
GO
DECLARE @ConstraintNameLubr NVARCHAR(255);
SELECT @ConstraintNameLubr = c.name
FROM sys.default_constraints c
JOIN sys.objects o ON o.object_id = c.parent_object_id
WHERE o.name = 'APLUBRIF_TMP';
IF @ConstraintNameLubr IS NOT NULL
BEGIN
EXEC('ALTER TABLE dbo.APLUBRIF_TMP DROP CONSTRAINT ' + @ConstraintNameLubr );
END
ALTER TABLE dbo.APLUBRIF_TMP SET (LOCK_ESCALATION = TABLE)
GO |
Com os devidos ajustes realizados nos objetos, a estrutura está pronta para ter seu schema alterado. O script a seguir será responsável por migrar os objetos e os dados presentes no schema DBO para o novo schema, que denominamos MULTICULTIVO.
| Bloco de código | ||||
|---|---|---|---|---|
| ||||
DECLARE @name NVARCHAR(256)
DECLARE @typedesc NVARCHAR(256)
DECLARE @sql NVARCHAR(MAX)
-- Cursor para selecionar todos os objetos do banco de dados
DECLARE object_cursor CURSOR FOR
SELECT d.name, d.type_desc
FROM sys.objects d
WHERE d.type IN ('U', 'V', 'P', 'FN', 'IF', 'TF','SO')
order by d.type_desc, d.name
/*
U: Tabelas
V: Views
P: Procedures
FN: Funções escalares
IF: Funções de tabela inline
TF: Funções de tabela
SO: Sequencias
*/
OPEN object_cursor
FETCH NEXT FROM object_cursor INTO @name, @typedesc
WHILE @@FETCH_STATUS = 0
BEGIN
-- Monta o comando ALTER SCHEMA
SET @sql = 'ALTER SCHEMA MULTICULTIVO TRANSFER dbo.' + QUOTENAME(@name)
-- Mostra o comando
print 'Instrucao: '+@sql+' Tipo objeto: '+ @typedesc
-- Executa o comando
EXEC sp_executesql @sql
FETCH NEXT FROM object_cursor INTO @name, @typedesc
END
CLOSE object_cursor
DEALLOCATE object_cursor |
Nesta etapa, será necessário percorrer manualmente as Views e Funções para remover as referências ao schema DBO e ao acesso à base de dados SYSDB. A instrução abaixo lista os objetos que contêm uma dessas referências. Nesses casos, as referências precisarão ser removidas e os objetos recompilados manualmente.
| Bloco de código | ||||
|---|---|---|---|---|
| ||||
SELECT
OBJECT_NAME(m.object_id) AS object_name,
o.type_desc AS object_type,
SCHEMA_NAME(o.schema_id) AS schema_name,
m.definition AS object_definition
FROM
sys.sql_modules m
INNER JOIN
sys.objects o ON m.object_id = o.object_id
WHERE
(UPPER(m.definition) LIKE '%DBO.%' OR UPPER(m.definition) LIKE '%SYSDB.%')
AND o.type IN ('FN', 'IF', 'TF', 'V')
AND SCHEMA_NAME(o.schema_id) = 'MULTICULTIVO'
AND OBJECT_NAME(m.object_id) <> 'fn_diagramobjects'
ORDER BY
o.type_desc,
OBJECT_NAME(m.object_id); |
A seguir, iremos reativar as sequências que foram desabilitadas para as tabelas APABASTEC_TMP e APLUBRIF_TMP. Para isso, execute o comando abaixo para adicionar as sequências novamente.
| Bloco de código | ||||
|---|---|---|---|---|
| ||||
ALTER TABLE [MULTICULTIVO].[APABASTEC_TMP] ADD CONSTRAINT [DF_APABASTEC_TMP_CD_APABASTEC_TMP] DEFAULT (NEXT VALUE FOR [MULTICULTIVO].[SEQ_CD_APABASTEC_TMP]) FOR [CD_APABASTEC_TMP]
GO
ALTER TABLE [MULTICULTIVO].[APLUBRIF_TMP] ADD CONSTRAINT [DF_APLUBRIF_TMP_CD_APLUBRIF_TMP] DEFAULT (NEXT VALUE FOR [MULTICULTIVO].[SEQ_CD_APLUBRIF_TMP]) FOR [CD_APLUBRIF_TMP]
GO
|
Precisaremos nessa etapa criar a estrutura do schema SSMA_ORACLE (também conhecido como SYSDB), é necessário substituir a propriedade {{DB_NAME}} pelo nome do banco de dados que será utilizado no ambiente. O script está disponível no arquivo totvs-agro-template_ssma_oracle.sql.
| Informações | ||||||
|---|---|---|---|---|---|---|
| ||||||
Devido ao extenso número de linhas, o conteúdo não será exibido diretamente nesta página, mas estará disponível como um arquivo anexo. Após realizar o download, substitua a propriedade {{DB_NAME}} pelo nome do banco de dados criado na seção anterior.
|
A última etapa do processo de migração consiste em conceder permissão ao usuário MULTICULTIVO para acessar o schema SSMA_ORACLE. Para isso, execute o comando abaixo:
| Bloco de código | ||||
|---|---|---|---|---|
| ||||
USE [TOTVS]
GO
ALTER AUTHORIZATION ON SCHEMA::[ssma_oracle] TO [MULTICULTIVO]
|