sql >> Base de Datos >  >> RDS >> Sqlserver

Cambiar la clasificación de la base de datos de SQL Server

Deberá eliminar WITH SCHEMABINDING de sus vistas y funciones con valores de tabla. Para identificarlos puedes consultar el INFORMATION_SCHEMA vistas:

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. Primero haga una copia de seguridad de la base de datos.
  2. Generar un ALTER secuencia de comandos de todas las vistas y funciones vinculadas al esquema.
  3. Elimine las palabras "WITH SCHEMABINDING " del guión.
  4. Ejecute el script varias veces, hasta que se resuelvan todos los errores de referencia.
  5. Cambie la intercalación en su base de datos.
  6. Cree un script y elimine todas las restricciones (claves, comprobaciones y valores predeterminados).
  7. Cambie la intercalación de cada columna usando el siguiente script.
  8. Recrear restricciones.
  9. Por último, ejecute la secuencia de comandos original varias veces para habilitar la vinculación de esquemas.

Puede cambiar la intercalación de todas las columnas con 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