Páginas filhas
  • PROCESSO DE MIGRAÇÃO NIMBVS PARA T-CLOUD (SQL SERVER)

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

...

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;  

1 -  Realizar um backup da base do TOTVS Agro Multicultivo do atual ambiente do Nimbus, que seja ser migrado para o ambiente do TCloud;  

2 - No processo de importação dessa  bases de dados no ambiente de TCloud já deve ser importado com um novo nome da Database já remetendo as caracteristicas de um estrutura que passará a receber múltiplos produtos, a nivel de schema.  

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
titlePontos de Atenção
  • As etapas descritas neste documento visam possibilitar a reestruturação do banco de dados do TOTVS Agro Multicultivo, que está no modelo Database, para o modelo Schema. Não é uma ferramenta de migração, mas sim um procedimento que deve ser realizado de forma manual;
  • Este processo é direcionado especificamente ao TOTVS Agro Multicultivo. No entanto, outros produtos, como PIMS Connector, TOTVS Connector Client entre outros não contempla nesse processo e 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. 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
languagesql
themeEclipse
titleCriação da estrutura
-- 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
Bloco de código
languagesql
themeEclipse
titleCriação da estrutura
Primeiro passo é criar o Login e depois o Schema e vincular o schema ao login . 

--- Criar o schema
CREATE SCHEMA [MULTICULTIVO]


USE [PIMSMC_CLAIDES_PROD_POCDEV]
GO
ALTER USER [U_MULTICULTIVO] WITH DEFAULT_SCHEMA=[MULTICULTIVO]

-- Criação do Usuário do MULTICULTIVO
CREATE LOGIN MULTICULTIVO WITH PASSWORD = '7F)*4@@YA7A*{qZRsk$';

-- Utilizando o Banco de Dados FAZENDA_TOTVS
USE [PIMSMC_CLAIDES_PROD_POCDEV];
GO

-- Criar Usuário no Banco de Dados PCONNECTOR
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 SCHEMATABLE TO MULTICULTIVO;



--Criação do Schema doGRANT EXECUTE TO MULTICULTIVO;
USE [PIMSMC_CLAIDES_PROD_POCDEV]
GO
CREATE SCHEMA [MULTICULTIVO] AUTHORIZATION [MULTICULTIVO]
GO


--Atribuição do Schema Default do MULTICULTIVO
USE [PIMSMC_CLAIDES_PROD_POCDEV]
GO
ALTER USER [MULTICULTIVO] WITH DEFAULT_SCHEMA=[MULTICULTIVO]
GO


--Ajuste da Permissão do MULTICULTIVO para acessar o Schema ssma_oracle
USE [PIMSMC_CLAIDES_PROD_POCDEV]
GO
ALTER AUTHORIZATION ON SCHEMA::[ssma_oracle] TO [MULTICULTIVO]

Bloco de código
languagesql
themeEclipse
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
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
languagesql
themeEclipse
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  
Bloco de código
languagesql
themeEclipse
---
SELECT o.name AS Object_Name, o.type_desc
FROM sys.objects o
JOIN sys.schemas s ON s.schema_id = o.schema_id
WHERE s.name = 'ssma_oracle' -- Replace with your schema name
ORDER BY o.type_desc, s.name, o.name

-- ### Passos antes de mudar de schema
-- Corrigir a view EVENTO_EMBALAGEM e retirar o "WITH NO SCHEMABINDING" do código
CREATE VIEW EVENTO_EMBALAGEM
WITH SCHEMABINDING AS

-- Retirar a referencia da sequence na tabela APABASTEC_TMP
SELECT c.name, c.definition
FROM sys.default_constraints c
JOIN sys.objects o ON o.object_id = c.parent_object_id
WHERE o.name = 'APABASTEC_TMP';

BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION
GO
ALTER TABLE dbo.APABASTEC_TMP
	DROP CONSTRAINT DF_APABASTEC_TMP_CD_APABASTEC_TMP;
GO
ALTER TABLE dbo.APABASTEC_TMP SET (LOCK_ESCALATION = TABLE)
GO
COMMIT

-- Depois que mudar o schema, voltar a sequencia para tabela
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

--Colocar este código na coluna CD_APABASTEC_TMP na tabela APABASTEC_TMP
(NEXT VALUE FOR dbo.SEQ_CD_APABASTEC_TMP)

------------------------------------------------------
USE [PIMSMC_CLAIDES_PROD_POCDEV]
GO

DROP VIEW [dbo].[EVENTO_EMBALAGEM]
GO
/****** Object:  View [dbo].[EVENTO_EMBALAGEM]    Script Date: 10/03/2025 14:16:07 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
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_PERIODOSAFRAEQUIPE 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_PERIODOSAFRA  ON (EQ_EVT_PERIODOSAFRA.ID_APEMBALAGEM = EVT.ID_APEMBALAGEM)

LEFT JOIN dbo.PERIODOSAFRAEQUIPE PS     ON (EVT_PERIODOSAFRA.ID_PERIODOSAFRA= PS.ID_PERIODOSAFRA)
LEFT JOIN dbo.SAFRA        S  EQ     ON (PSEQ.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) )


-----------------------------------------------------------------------------
SELECT
	schema_name(o.schema_id) dono_objeto,
    o.name AS view_name,
    m.definition AS view_definition,
	o.type_desc tipo_objeto
	
FROM 
    sys.objects o
INNER JOIN 
    sys.sql_modules m ON o.object_id = m.object_id
WHERE  upper(m.definition) LIKE '%DBO%'
order by schema_name(o.schema_id), o.type_desc, o.name
	
	
	
DECLARE @sql NVARCHAR(MAX)
DECLARE @obj_name NVARCHAR(255)
DECLARE @obj_type NVARCHAR(2)

-- Cursor para iterar sobre todos os objetos que possuem "dbo."
DECLARE cur CURSOR FOR
SELECT 
    o.name,
    o.type
FROM 
    sys.objects o
INNER JOIN 
    sys.sql_modules m ON o.object_id = m.object_id
WHERE  upper(m.definition) LIKE '%DBO%'  -- Procurando o prefixo dbo.
 AND o.type IN ('P', 'V', 'FN', 'TR')  -- Types: P = Stored Procedures, V = Views, FN = Functions, TR = Triggers
 AND schema_name(o.schema_id) = 'MULTICULTIVO'
order by schema_name(o.schema_id), o.type_desc, o.name;

OPEN cur
FETCH NEXT FROM cur INTO @obj_name, @obj_type

WHILE @@FETCH_STATUS = 0
BEGIN
    -- Gerar o script de alteração
    SET @sql = 'ALTER ' + 
               CASE 
                   WHEN @obj_type = 'P' THEN 'PROCEDURE '
                   WHEN @obj_type = 'V' THEN 'VIEW '
                   WHEN @obj_type = 'FN' THEN 'FUNCTION '
                   WHEN @obj_type = 'TR' THEN 'TRIGGER '
               END + @obj_name + ' AS '
               
    -- Substitui "dbo." por nada no código do objeto
    SET @sql = @sql + REPLACE((SELECT definition FROM sys.sql_modules WHERE object_id = OBJECT_ID(@obj_name)), 'dbo.', '')

    -- Comando executado
    print 'Comando: '+@sql+ ' Tipo objeto:> ' + @obj_type
	
    -- Executa o script de atualização
    EXEC sp_executesql @sql

    FETCH NEXT FROM cur INTO @obj_name, @obj_type
END

CLOSE cur
DEALLOCATE curEQUIPE=  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
languagesql
themeEclipse
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
languagesql
themeEclipse
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
languagesql
themeEclipse
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
languagesql
themeEclipse
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
iconfalse

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.


View file
nametotvs-agro-template_ssma_oracle.sql
height250



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:


Eclipse
Bloco de código
languagesql
themeEclipse
USE [TOTVS]
GO
ALTER AUTHORIZATION ON SCHEMA::[ssma_oracle] TO [MULTICULTIVO]
Bloco de código
languagesql
themeEclipse
Bloco de código
languagesql
themeEclipse
Bloco de código
languagesql
theme