Pular para o conteúdo principal
Version: 4.21.0

Conversão do Banco de Dados para Unicode

Este é o guia para conversão do collation do banco de dados e das colunas de texto para suporte unicode. Nesse caso, usar o collation com suporte a UTF-8 no Microsoft SQL Server (Disponível somente a partir da versão 2019).

Para aplicar a atualização siga os passos descritos mais abaixo, considerando os pontos de atenção a seguir:

Atenção
  • Crie um backup do banco de dados antes de executar qualquer um dos passos;

  • Garanta que o ambiente (Fusion) esteja fora do ar, e não haja outras sessões conectadas ao banco de dados;

  • Garanta que as consultas realizadas tragam todos os valores possíveis, ou seja, que não esteja limitado o número de linhas retornadas pela ferramenta utilizada para execução dos scripts, e que o usuário tenha permissão para alteração de schema e collation;

  • Certifique-se de estar sempre conectado a sessão correta do banco que deseja aplicar a correção.

Passos:

  1. Collation do banco de dados

Se o banco de dados já possuir as alterações necessárias da collation para UTF-8, pule este passo.

É necessário alterar a collation do banco de dados pois é a partir da collation dela que é definido à das novas colunas e tabelas, como tabelas geradas dinamicamente ao criar um formulário.

Edite o arquivo database.sql e altere o valor nomeDoBancoDeDados para o nome do seu banco de dados que terá o collation alterado.

ALTER DATABASE [nomeDoBancoDeDados] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
ALTER DATABASE [nomeDoBancoDeDados] COLLATE Latin1_General_100_CI_AS_SC_UTF8;
ALTER DATABASE [nomeDoBancoDeDados] SET MULTI_USER WITH ROLLBACK IMMEDIATE;

Em seguida consulte se a collation foi modificada através do comando abaixo:

SELECT name, collation_name  FROM sys.databases where name = 'nomeDoBancoDeDados';
Atenção

A collation a ser alterada recebe o mesmo nome da collation atual com o sufixo _UTF8.

You can find more details in the official Microsoft documentation, via this link.

  1. Execução do scripts

Após executar todos os scripts, é necessário apenas guardar os resultados gerados, pois os mesmos serão executados nos próximos passos.

  1. Remoção das Constraints e Índices

Execute o resultado dos scripts constraints-drop.sql

SELECT
('ALTER TABLE ' + quotename(Col.TABLE_NAME) + ' DROP CONSTRAINT IF EXISTS ' + quotename(Col.CONSTRAINT_NAME) + ';') dropConstraint
FROM
INFORMATION_SCHEMA.TABLE_CONSTRAINTS Tab,
INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE Col
WHERE
Col.Constraint_Name = Tab.Constraint_Name
AND
Col.Table_Name = Tab.Table_Name
ORDER BY
Tab.CONSTRAINT_TYPE ASC;

E também do indexes-drop.sql

SELECT
('DROP INDEX IF EXISTS ' + quotename(ind.name) + ' ON ' + quotename(t.name) + ';') dropIndex
FROM
sys.indexes ind
INNER JOIN sys.index_columns ic ON
ind.object_id = ic.object_id
and ind.index_id = ic.index_id
INNER JOIN sys.columns col ON
ic.object_id = col.object_id
and ic.column_id = col.column_id
INNER JOIN sys.tables t ON
ind.object_id = t.object_id;
Atenção

Verifique se as constrainsts (Chaves) e indíces foram removidas das tabelas do Fusion, isto pode ser feito executando os scripts constraints-drop.sql e indexes-drop.sql, ao qual não deve retornar nenhum valor.

  1. Alteração do collation e do tamanho das colunas do tipo texto

Execute o resultado dos scripts update-column-collation.sql

SELECT
('ALTER TABLE ' + quotename(TABLE_NAME) +
' ALTER COLUMN ' + quotename(COLUMN_NAME) + ' ' + quotename(DATA_TYPE) + '(' +
(CASE
WHEN
CHARACTER_MAXIMUM_LENGTH < 1 THEN 'MAX'
ELSE LTRIM(RTRIM(CHARACTER_MAXIMUM_LENGTH))
END + ')'
+ ' COLLATE Latin1_General_100_CI_AS_SC_UTF8 ' +
CASE
IS_NULLABLE WHEN 'YES' THEN ' NULL'
WHEN
'NO' THEN ' NOT NULL'
END)) query
FROM
INFORMATION_SCHEMA.COLUMNS
WHERE
DATA_TYPE in
('varchar')
and COLLATION_NAME != 'Latin1_General_100_CI_AS_SC_UTF8';

Esse comando gera os comandos de atualização para coluna do banco de dados, adicionando a collation de UTF-8 nas colunas.

E update-column-size.sql que gera os comandos para multiplicar o tamanho das colunas por 4.

SELECT
('ALTER TABLE ' + quotename(TABLE_NAME) + ' ALTER COLUMN ' + quotename(COLUMN_NAME) + ' ' + quotename(DATA_TYPE) + '(' + (
CASE
WHEN
CHARACTER_MAXIMUM_LENGTH < 1
OR CHARACTER_MAXIMUM_LENGTH * 4 > 8000
THEN
'MAX'
ELSE
LTRIM(RTRIM(CHARACTER_MAXIMUM_LENGTH * 4))
END
+ ') ' + (
CASE
WHEN
IS_NULLABLE = 'NO'
THEN
' NOT NULL'
ELSE
''
END
))) query
FROM
INFORMATION_SCHEMA.COLUMNS
WHERE
DATA_TYPE in
(
'varchar'
)
AND TABLE_NAME NOT LIKE 'QRTZ_%'
Atenção

O resultado do script update-column-size.sql não pode ser executado mais que uma vez.

Nota

Dependendo do tamanho do banco a alteração do collation da coluna pode demorar, neste caso recomenda-se executar os comandos gerados no resultado do update-column-collation.sql em partes, de forma fracionada.

  1. Criação das Constraints e Índices

Execute o resultado dos scripts constraints-add.sql

SELECT distinct
('IF NOT EXISTS((SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE TABLE_NAME=''' + Col.TABLE_NAME + ''' AND CONSTRAINT_NAME='''
+ Tab.CONSTRAINT_NAME + ''' AND CONSTRAINT_TYPE=''' + Tab.CONSTRAINT_TYPE +''')) ' +
'ALTER TABLE ' + Col.TABLE_NAME + ' ADD CONSTRAINT ' + Col.CONSTRAINT_NAME + ' ' + Tab.CONSTRAINT_TYPE
+ ' (' + STUFF((
SELECT ', ' + md.COLUMN_NAME
FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE md
WHERE md.CONSTRAINT_NAME = Col.CONSTRAINT_NAME
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '') + ')') createConstraint
FROM
INFORMATION_SCHEMA.TABLE_CONSTRAINTS Tab,
INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE Col
WHERE
Col.Constraint_Name = Tab.Constraint_Name
AND
Col.Table_Name = Tab.Table_Name AND Tab.CONSTRAINT_NAME LIKE 'PK%' ;

E também o indexes-create.sql

SELECT
('IF NOT EXISTS(SELECT object_id FROM sys.indexes WHERE Name = ''' + (ind.[name] COLLATE Latin1_General_100_CI_AS_SC_UTF8) + ''') CREATE ' + ind.[type_desc] + ' INDEX ' + (ind.[name] COLLATE Latin1_General_100_CI_AS_SC_UTF8)
+ ' ON ' + t.name + '(' + col.name + ' ASC ) WITH ( PAD_INDEX = OFF , FILLFACTOR = 100, SORT_IN_TEMPDB = OFF , IGNORE_DUP_KEY = OFF , STATISTICS_NORECOMPUTE = OFF , ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON ) ON [PRIMARY ];') createIndex
FROM
sys.indexes ind
INNER JOIN sys.index_columns ic ON
ind.object_id = ic.object_id
and ind.index_id = ic.index_id
INNER JOIN sys.columns col ON
ic.object_id = col.object_id
and ic.column_id = col.column_id
INNER JOIN sys.tables t ON
ind.object_id = t.object_id;

Ambos geram os comandos de criação de constraints do banco.

Verifique se as constraints (Chaves) e indíces foram recriados nas tabelas do Fusion, isto pode ser feito executando os scripts constraints-add.sql e indexes-create.sql, ao qual o resultado deve ser o mesmo que o gerado no passo 2.

Nota

Dependendo do tamanho do banco a criação dos indíces pode demorar, neste caso recomenda-se executar os comandos gerados no resultado do scripts indexes-create.sql em partes, de forma fracionada.

  1. Remoção do cache de banco do Fusion

Remova os arquivos com a extensâo .dbc armazenados dentro da pasta db_cache, que está dentro da pasta do repositório de arquivos do Fusion, que está definida nas configurações de sistema.

Após execução sem erros de todos estes passos a aplicação pode ser iniciada.

Atenção

É suportado apenas um tipo de conversão SQL Server 2019 usando o Collation. Nesse caso, Oracle e MySQL não estão homologados.

Atenção

O uso de banco com Unicode afeta consideravelmente a performance, portanto, indicamos fazer o uso do mesmo se realmente for necessário ter um ambiente com multi-idiomas.

Para mais detalhes e informações, indicamos verificar a documentação oficial do Microsoft SQL Server.