O processo de migração do banco de dados tem como objetivo principal viabilizar a transferência dos dados atualmente armazenados no ambiente Nimbus (TCloud), no formato Database, para a plataforma T-Cloud, no formato Database Schema.

O foco específico deste processo é migrar a base do TOTVS Agro Multicultivo, que atualmente está no nível de database com um schema padrão denominado dbo, para um schema personalizado, que será nomeado como MULTICULTIVO. Essa migração permitirá transformar /  alterar, de forma simples, a estrutura que está em um schema padrão (dbo) para um schema customizado. Além disso, a mudança possibilitará que o database receba novos produtos a nível de schema, garantindo maior organização e flexibilidade.


Este processo é direcionado especificamente ao TOTVS Agro Multicultivo. No entanto, outros produtos, como PIMS Connector, TOTVS Connector Client entre outros, precisarão ser reinstalados, uma vez que serão necessárias reconfigurações nos processos de integração.


A seguir, descreveremos as etapas necessárias para alterar o schema dbo para um novo schema:





-- 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



Iniciamos os procedimentos de pré-migração e 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.


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.


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


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.


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