Come posso modificare le regole di confronto di un database di SQL Server?


16

Sto cercando di standardizzare tutti i database su una singola fascicolazione - Latin1_General_CI_AS (la fascicolazione standard). Ho alcuni database che si trovano in SQL_Latin1_General_CP1_CI_AS.

So di poter utilizzare ALTER DATABASE per modificare le regole di confronto del database, ma ciò influisce solo sui nuovi oggetti. La mia comprensione è che l'unico modo per cambiare le colonne esistenti è fare ALTER COLUMN su ogni colonna di ogni tabella - e per farlo dovrei anche eliminare e ricreare tutti gli indici.

Immagino che sarebbe simile a questo:

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 ripetere per ogni colonna varchar, char, text, nvarchar, nchar e ntext nell'intero database. Sarebbe un enorme script SQL.

C'è un modo più semplice per farlo o qualcuno può suggerire un modo per automatizzare la creazione di uno script SQL per farlo?

Risposte:


9

MS KB 325335 ha opzioni su come eseguire questa operazione per l'intero db e tutte le colonne.

Fondamentalmente:

  1. Tabelle del database di script (con nuove regole di confronto)
  2. Dati DTS / SSIS (guardare le regole di confronto)
  3. Aggiungi vincoli


2

Purtroppo questo non è un compito facile in SQL Server.

È possibile utilizzare uno strumento di scripting come SQL Compare di Redgate per gli oggetti di database esistenti (tabelle, procedure memorizzate, viste ecc.) Se non si dispone di una licenza, è possibile utilizzare una versione di prova gratuita. Dopo aver creato il nuovo database con le giuste regole di confronto e ricostruito gli oggetti dallo script, è possibile eseguire SSIS per trasferire i dati da un database a un altro. Se si dispone di molti dati, utilizzare l'inserimento bulk T-SQL.

Per avere le regole di confronto corrette per i database futuri su quel server, è possibile modificare le regole di confronto predefinite sul server. Il seguente articolo MSDN spiega cosa cambia usando le clausole COLLATE di ALTER DATABASE e ALTER TABLE:

Impostazione e modifica delle regole di confronto del database (documentazione online di SQL Server 2008)

È possibile modificare le regole di confronto di tutti i nuovi oggetti creati in un database utente utilizzando la clausola COLLATE dell'istruzione ALTER DATABASE . Questa istruzione non modifica le regole di confronto delle colonne in alcuna tabella definita dall'utente esistente. Questi possono essere modificati utilizzando la clausola COLLATE di ALTER TABLE .

Quando si modificano le regole di confronto del database, si modifica quanto segue:

  • Le regole di confronto predefinite per il database. Queste nuove regole di confronto predefinite vengono applicate a tutte le colonne, i tipi di dati definiti dall'utente, le variabili e i parametri creati successivamente nel database. Viene anche utilizzato quando si risolvono gli identificatori di oggetto specificati nelle istruzioni SQL rispetto agli oggetti definiti nel database.
  • Qualsiasi colonna char, varchar, text, nchar, nvarchar o ntext nelle tabelle di sistema viene cambiata nella nuova fascicolazione.
  • Tutti i parametri char, varchar, text, nchar, nvarchar o ntext esistenti e i valori di ritorno scalari per le procedure memorizzate e le funzioni definite dall'utente vengono cambiati nella nuova fascicolazione.
  • I tipi di dati di sistema char, varchar, text, nchar, nvarchar o ntext e tutti i tipi di dati definiti dall'utente basati su questi tipi di dati di sistema, vengono cambiati con le nuove regole di confronto predefinite.

1

Generalmente non è consigliabile farlo su un server live. L'ultima volta che ho guardato, farlo non è stato ufficialmente supportato da Microsoft. Per fare questo in pratica, devi creare una nuova istanza con le giuste regole di confronto e migrare il database su di esso.

Il ripristino di un DB con un server con regole di confronto predefinite diverse provoca ogni tipo di divertimento poiché tempdb avrà le regole di confronto del nuovo server, quindi anche questo non è raccomandato.


1

Prova questa utility , che dato un database di origine genererà tutti gli script necessari per essere applicati su un database di destinazione in modo che le regole di confronto vengano modificate in modo sicuro.


1

È possibile utilizzare le viste Infomation_Schema per generare uno script abbastanza facilmente, ma non sono sicuro che sia il modo migliore per risolvere il problema. Ricreare tutti gli indici su un db di grandi dimensioni potrebbe richiedere un'enorme quantità di tempo / spazio di log ecc. Andrei con migrare (non ripristinare) in una nuova istanza.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.