Published on

February 26, 2011

Compreendendo a Colação do SQL Server

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:

  1. Execute scripts para minimizar ações manuais.
  2. Reconstrua o banco de dados mestre para alterar a colação do servidor.
  3. 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:

  1. 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.
  2. 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:
  3. 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
    
  4. 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.
  5. 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”.
  6. 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.
  7. 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:
  8. 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]

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.