Como altero o agrupamento de um banco de dados do SQL Server?

16

Estou tentando padronizar todos os bancos de dados em um único agrupamento - Latin1_General_CI_AS (o agrupamento padrão). Eu tenho alguns bancos de dados que estão no SQL_Latin1_General_CP1_CI_AS.

Eu sei que posso usar ALTER DATABASE para alterar o agrupamento do banco de dados, mas isso afeta apenas novos objetos. Meu entendimento é que a única maneira de alterar as colunas existentes é ALTER COLUMN em cada coluna em todas as tabelas - e eu precisaria soltar e recriar todos os índices para fazer isso.

Eu acho que seria algo como isto:

DROP INDEX indexname ON tablename

GO

ALTER TABLE tablename ALTER COLUMN columname varchar(50) COLLATE Latin1_General_CI_AS NULL

GO

CREATE CLUSTERED INDEX indexname ON tablename (columname ASC)

e repita para todas as colunas varchar, char, text, nvarchar, nchar e ntext em todo o banco de dados. Isso seria um enorme script SQL.

Existe uma maneira mais fácil de fazer isso ou alguém pode sugerir uma maneira de automatizar a criação de um script SQL para fazer isso?

Richard Gadsden
fonte

Respostas:

9

MS KB 325335 tem opções sobre como fazer isso para o banco de dados inteiro e todas as colunas.

Basicamente:

  1. Tabelas de banco de dados de script (com novo agrupamento)
  2. Dados DTS / SSIS (assistindo ao agrupamento)
  3. Adicionar restrições
gbn
fonte
2

Infelizmente, essa não é uma tarefa fácil no SQL Server.

Você pode usar uma ferramenta de script como o SQL Compare da Redgate para seus objetos de banco de dados existentes (tabelas, procedimentos armazenados, visualizações etc.) Se você não possui uma licença, pode usar uma avaliação gratuita. Depois de criar o novo banco de dados com o agrupamento correto e reconstruir os objetos do seu script, você poderá executar o SSIS para transferir dados de um banco de dados para outro. Se você tiver muitos dados, use a inserção em massa do T-SQL.

Por ter o agrupamento correto para futuros bancos de dados nesse servidor, você pode alterar o agrupamento padrão no servidor. O seguinte artigo do MSDN explica o que é alterado usando as cláusulas COLLATE de ALTER DATABASE e ALTER TABLE:

Definindo e alterando o agrupamento de banco de dados (Manuais Online do SQL Server 2008)

Você pode alterar o agrupamento de quaisquer novos objetos criados em um banco de dados do usuário usando a cláusula COLLATE da instrução ALTER DATABASE . Esta instrução não altera o agrupamento das colunas em nenhuma tabela definida pelo usuário existente. Isso pode ser alterado usando a cláusula COLLATE de ALTER TABLE .

Quando você altera o agrupamento do banco de dados, altera o seguinte:

  • O agrupamento padrão para o banco de dados. Esse novo agrupamento padrão é aplicado a todas as colunas, tipos de dados definidos pelo usuário, variáveis ​​e parâmetros criados posteriormente no banco de dados. Também é usado ao resolver os identificadores de objeto especificados nas instruções SQL em relação aos objetos definidos no banco de dados.
  • Quaisquer colunas char, varchar, text, nchar, nvarchar ou ntext nas tabelas do sistema são alteradas para o novo agrupamento.
  • Todos os parâmetros char, varchar, text, nchar, nvarchar ou ntext existentes e os valores de retorno escalar para procedimentos armazenados e funções definidas pelo usuário são alterados para o novo agrupamento.
  • Os tipos de dados do sistema char, varchar, text, nchar, nvarchar ou ntext e todos os tipos de dados definidos pelo usuário com base nesses tipos de dados do sistema são alterados para o novo agrupamento padrão.
splattne
fonte
1

Geralmente, não é recomendável fazer isso em um servidor ativo. A última vez que olhei, fazer isso não era oficialmente suportado pela Microsoft. Para fazer isso na prática, você deve criar uma nova instância com o agrupamento correto e migrar o banco de dados para ele.

A restauração de um banco de dados com um servidor com um agrupamento padrão diferente causa todo tipo de diversão, já que o tempdb terá o agrupamento do novo servidor, portanto, isso também não é recomendado.

ConcernedOfTunbridgeWells
fonte
1

Experimente este utilitário , que, dado um banco de dados de origem, gerará todos os scripts necessários para serem aplicados em um banco de dados de destino, para que o agrupamento seja alterado com segurança.

Manea Florin
fonte
1

Você pode usar as visualizações Infomation_Schema para gerar um script com bastante facilidade, mas não tenho certeza se essa é a melhor maneira de resolver seu problema. Recriar todos os índices em um banco de dados amplo pode levar uma quantidade enorme de tempo / espaço de log etc. Eu iria migrar (não restaurar) para uma nova instância.

Dave Jackson
fonte