Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Alterando a classificação do banco de dados SQL Server


Você precisará remover WITH SCHEMABINDING de suas visualizações e funções com valor de tabela. Para identificá-los, você pode consultar o INFORMATION_SCHEMA Visualizações:
SELECT TABLE_SCHEMA, TABLE_NAME AS VIEW_NAME
FROM INFORMATION_SCHEMA.VIEWS
WHERE VIEW_DEFINITION LIKE '%SCHEMABINDING%'

SELECT ROUTINE_SCHEMA, ROUTINE_NAME
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_DEFINITION LIKE '%SCHEMABINDING%'
  1. Primeiro faça backup do banco de dados.
  2. Gere um ALTER script de todas as visualizações e funções vinculadas ao esquema.
  3. Exclua as palavras "WITH SCHEMABINDING " do script.
  4. Execute o script algumas vezes, até que todos os erros de referência sejam resolvidos.
  5. Altere o agrupamento em seu banco de dados.
  6. Script e descarte todas as restrições (chaves, verificações e padrões).
  7. Altere o agrupamento de cada coluna usando o script abaixo.
  8. Recriar restrições.
  9. Por fim, execute o script original algumas vezes para ativar a vinculação de esquema.

Você pode alterar o agrupamento de todas as colunas com este script:
DECLARE @collation nvarchar(128)
DECLARE @commands table ([SQL] nvarchar(max))
DECLARE @cursor cursor
DECLARE @sql nvarchar(max)

SET @collation = 'SQL_Latin1_General_CP1_CI_AS'

INSERT @commands ([SQL])
SELECT 'ALTER TABLE ' + QUOTENAME(c.TABLE_SCHEMA) +'.'+ QUOTENAME(c.TABLE_NAME)
    + ' ALTER COLUMN ' + QUOTENAME(c.COLUMN_NAME)
    + ' ' + c.DATA_TYPE
    + ISNULL('(' + LTRIM(STR(c.CHARACTER_MAXIMUM_LENGTH)) + ')', '')
    + ISNULL(' COLLATE ' + @collation, '')
    + ' ' + CASE c.IS_NULLABLE WHEN 'NO' THEN 'NOT ' ELSE '' END + 'NULL'
FROM INFORMATION_SCHEMA.COLUMNS c
INNER JOIN INFORMATION_SCHEMA.TABLES t
ON t.TABLE_SCHEMA = c.TABLE_SCHEMA AND t.TABLE_NAME = c.TABLE_NAME
WHERE t.TABLE_TYPE = 'BASE TABLE'
AND c.COLLATION_NAME <> @collation

SET @cursor = CURSOR FOR SELECT [SQL] FROM @commands
OPEN @cursor
FETCH NEXT FROM @cursor INTO @sql

WHILE @@FETCH_STATUS = 0
BEGIN 
    PRINT @sql
    EXEC (@sql)

    FETCH NEXT FROM @cursor INTO @sql
END