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) no formato Database para TCloud no formato Database Schema. O processo que irá.
O foco desse processo é trazer a base do TOTVS Agro Multicultivo que está a nível de databas com um schema padrão denomidado dbo, para uma schema diferente, nesse processo iremos nomeá-la de MULTICULTIVO, com isso conseguimos de forma simples transformar uma estrutura que está em uma 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.
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 SCHEMA TO MULTICULTIVO;
--Criação do Schema do 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]
|
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 |
---
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_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) )
-----------------------------------------------------------------------------
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 cur |