Ao trabalhar com o SQL Server, é importante entender o conceito de colação. A colação determina como as operações de comparação e ordenação de strings são realizadas no SQL Server. Ela define as regras para comparar e ordenar caracteres em um banco de dados.
Em alguns casos, você pode encontrar um cenário em que o ambiente de preparação do SQL possui uma colação diferente do ambiente de produção do SQL. Isso pode levar a resultados inconsistentes ao implantar scripts da preparação para a produção.
Por exemplo, vamos supor que você tenha uma colação que não diferencia maiúsculas de minúsculas (SQL_Latin1_General_CP1_CI_AS) no seu ambiente de preparação e uma colação que diferencia maiúsculas de minúsculas (SQL_Latin1_General_CP1_CS_AS) no seu ambiente de produção. Executar um script que compara duas strings nesses dois ambientes pode resultar em resultados diferentes.
Para ilustrar isso, considere o seguinte script:
DECLARE @strA VARCHAR(10) DECLARE @strB VARCHAR(10) SET @strA = 'abcdefghij' SET @strB = 'ABCDEFGHIJ' IF @strA = @strB PRINT 'Colação que não diferencia maiúsculas de minúsculas' ELSE PRINT 'Colação que diferencia maiúsculas de minúsculas'
No ambiente de preparação com uma colação que não diferencia maiúsculas de minúsculas, o script imprimirá ‘Colação que não diferencia maiúsculas de minúsculas’ porque a comparação não é sensível a maiúsculas e minúsculas. No ambiente de produção com uma colação que diferencia maiúsculas de minúsculas, o script imprimirá ‘Colação que diferencia maiúsculas de minúsculas’ porque a comparação é sensível a maiúsculas e minúsculas.
Essa situação inconsistente pode ter consequências graves ao implantar scripts da preparação para a produção. Para evitar tais problemas, é essencial ter um ambiente de colação igual.
Para resolver esse problema, você pode alterar a colação do seu ambiente de preparação para corresponder ao ambiente de produção. Aqui estão os passos para fazer isso:
- Execute scripts para minimizar ações manuais.
- Reconstrua o banco de dados mestre para alterar a colação do servidor.
- Configure todos os bancos de dados, logins e configurações.
Primeiro, execute o seguinte script para desanexar todos os bancos de dados de usuário:
SELECT 'EXEC sp_detach_db ''' + name + ''', ''false''' FROM sysdatabases WHERE name NOT IN ('master','tempdb','model','msdb','northwind')
Salve o resultado deste script como “detachdbs.sql”.
Em seguida, crie um script para anexar todos os bancos de dados de usuário. Execute o seguinte script e salve o resultado como “attachdbs.sql”:
DECLARE @dbname varchar(50) DECLARE @dbname_prev varchar(50) DECLARE @file varchar(150) SET @dbname_prev = ' ' DECLARE cAttach CURSOR READ_ONLY FOR SELECT a.name, b.filename FROM sysdatabases a INNER JOIN sysaltfiles b ON a.dbid = b.dbid WHERE a.name NOT IN ('master','tempdb','model','msdb','northwind', 'pubs') ORDER BY 1 OPEN cAttach FETCH NEXT FROM cAttach INTO @dbname, @file WHILE (@@fetch_status = 0) BEGIN IF (@dbname_prev <> @dbname) BEGIN IF (@dbname_prev <> ' ') PRINT 'PARA ANEXAR ' PRINT '' PRINT 'CREATE DATABASE [' + @dbname + '] ON' PRINT '( FILENAME = ''' + rtrim(@file) + ''') ' END ELSE PRINT ', ( FILENAME = ''' + rtrim(@file) + ''') ' SET @dbname_prev = @dbname FETCH NEXT FROM cAttach INTO @dbname, @file END CLOSE cAttach DEALLOCATE cAttach PRINT 'PARA ANEXAR ' GO
Depois disso, crie um script para criar todos os logins do SQL. O banco de dados mestre é o repositório dos logins. Execute o seguinte script e salve o resultado como “Logins.sql”:
EXEC dbo.sp_help_revlogin
Além disso, as credenciais das funções do servidor localizadas no banco de dados mestre são perdidas após a reconstrução do banco de dados mestre. Execute o seguinte script e salve-o como “LoginRoles.sql”:
SELECT 'EXEC master..sp_addsrvrolemember @loginame = N''' + [name] + ''', @rolename = N''sysadmin''' AS script FROM syslogins WHERE sysadmin = 1 UNION SELECT 'EXEC master..sp_addsrvrolemember @loginame = N''' + [name] + ''', @rolename = N''securityadmin''' AS script FROM syslogins WHERE securityadmin = 1 UNION SELECT 'EXEC master..sp_addsrvrolemember @loginame = N''' + [name] + ''', @rolename = N''serveradmin''' AS script FROM syslogins WHERE serveradmin = 1 UNION SELECT 'EXEC master..sp_addsrvrolemember @loginame = N''' + [name] + ''', @rolename = N''setupadmin''' AS script FROM syslogins WHERE setupadmin = 1 UNION SELECT 'EXEC master..sp_addsrvrolemember @loginame = N''' + [name] + ''', @rolename = N''processadmin''' AS script FROM syslogins WHERE processadmin = 1 UNION SELECT 'EXEC master..sp_addsrvrolemember @loginame = N''' + [name] + ''', @rolename = N''diskadmin''' AS script FROM syslogins WHERE diskadmin = 1 UNION SELECT 'EXEC master..sp_addsrvrolemember @loginame = N''' + [name] + ''', @rolename = N''dbcreator''' AS script FROM syslogins WHERE dbcreator = 1 UNION SELECT 'EXEC master..sp_addsrvrolemember @loginame = N''' + [name] + ''', @rolename = N''bulkadmin''' AS script FROM syslogins WHERE bulkadmin = 1
Antes de prosseguir, é recomendado exportar e criar scripts de todos os objetos no banco de dados, como pacotes SSIS, jobs de script e servidores vinculados, para garantir que nada seja perdido durante o processo.
Depois que a preparação estiver concluída, você pode começar com as etapas reais:
- Desanexe todos os bancos de dados de usuário, garantindo que todos estejam desconectados e interrompendo os serviços de aplicativo que se conectam ao ambiente de preparação. Execute o script preparado “detachdbs.sql” para desanexar os bancos de dados.
- Reconstrua o banco de dados mestre para alterar a colação do servidor. Desligue o serviço do SQL Server e localize a pasta Setup Bootstrap (geralmente C:\Program Files\Microsoft SQL Server\{versão}\Setup Bootstrap\Release). Execute o seguinte comando, substituindo os espaços reservados pelos valores corretos:
- Após uma instalação bem-sucedida, verifique se a colação da Instância do SQL foi alterada para SQL_Latin1_General_CP1_CI_AS. Você pode fazer isso clicando com o botão direito na instância no Explorador de Objetos, selecionando Propriedades e verificando a Colação do Servidor na página Geral.
- Execute os scripts preparados:
- Anexe todos os bancos de dados de usuário com “attachdbs.sql”.
- Crie logins do SQL com “Logins.sql”.
- Crie funções do servidor para os logins com “LoginRoles.sql”.
- Reconfigure sua Instância do SQL para garantir que todas as configurações estejam definidas corretamente. Você pode consultar a documentação oficial para obter mais informações sobre como configurar sua instância do SQL.
- Por fim, altere a colação dos bancos de dados de usuário. Execute o resultado do seguinte script, garantindo que você tenha um bloqueio exclusivo no banco de dados:
Setup /QUIET /ACTION=REBUILDDATABASE /INSTANCENAME={NOME DA INSTÂNCIA} /SQLSYSADMINACCOUNTS={DOMÍNIO}\{CONTA DO WINDOWS} /SAPWD={SENHA DO SA} /SQLCOLLATION=SQL_Latin1_General_CP1_CI_AS
SELECT 'ALTER DATABASE [' + [name] + '] COLLATE SQL_Latin1_General_CP1_CI_AS' FROM sys.databases WHERE collation_name <> 'SQL_Latin1_General_CP1_CI_AS'
Ao seguir essas etapas, você pode garantir que seus ambientes de preparação e produção tenham a mesma colação, evitando quaisquer inconsistências ao implantar scripts.
Espero que você ache este artigo útil. Se tiver algum comentário ou pergunta, por favor, me avise!
Autor: [Seu Nome]