Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Modification du tri de la base de données SQL Server

Vous devrez supprimer WITH SCHEMABINDING à partir de vos vues et fonctions table. Pour les identifier, vous pouvez interroger le INFORMATION_SCHEMA vues :

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. Première sauvegarde de la base de données.
  2. Générer un ALTER script de toutes les vues et fonctions liées au schéma.
  3. Supprimez les mots "WITH SCHEMABINDING " du script.
  4. Exécutez le script plusieurs fois, jusqu'à ce que toutes les erreurs de référence soient résolues.
  5. Modifiez le classement de votre base de données.
  6. Script et supprimez toutes les contraintes (clés, vérifications et valeurs par défaut).
  7. Modifiez le classement de chaque colonne à l'aide du script ci-dessous.
  8. Recréer des contraintes.
  9. Enfin, exécutez le script d'origine plusieurs fois pour activer la liaison de schéma.

Vous pouvez modifier le classement de toutes les colonnes avec ce 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