7

Ho un database in esecuzione in SQL Server 2005 con replica di tipo merge. Voglio cambiare alcune delle colonne FK per essere 'non null' come dovrebbero sempre avere un valore. SQL server non mi permette di farlo, però, questo è quello che dice:Modifica del vincolo di colonna null/not null = errore di replica di rowguid

  • Impossibile modificare la tabella. Non è valido eliminare il vincolo predefinito nella colonna rowguid utilizzata dalla replica di unione . La modifica dello schema non è riuscita durante l'esecuzione di una procedura di replica interna . Per l'azione correttiva , vedere gli altri messaggi di errore che accompagnano questo messaggio di errore. La transazione terminata nel trigger. Il batch è stato interrotto.

Non sto cercando di cambiare i vincoli sulla colonna di rowguid a tutti, solo su un'altra colonna che funge da FK. Altre colonne che voglio impostare non sono nulle perché il record non ha alcun senso senza quella informazione (cioè su un cliente, il nome del cliente).

Domande: C'è un modo per aggiornare le colonne "non null" senza disattivare la replica e poi riaccenderla? Questo è anche il modo migliore per farlo - dovrei usare invece un vincolo?

risposta

8

Apparentemente SSMS apporta modifiche alle tabelle rilasciandole e ricreandole. Quindi, ho solo bisogno di apportare le modifiche usando l'istruzione T-SQL.

ALTER TABLE dbo.MyTable ALTER COLUMN MyColumn nvarchar(50) NOT NULL 
3

È necessario scritto il vostro cambiamento di istruzioni T-SQL come SQL Server Management Studio cercherà di eliminare e ricreare la tabella, in contrasto con l'aggiunta semplicemente la colonna aggiuntiva.

Sarà inoltre necessario aggiungere la nuova colonna alle pubblicazioni.

Si noti che la modifica di una colonna in questo modo può essere dannosa per le prestazioni di Replica. A seconda della dimensione della tabella che si sta modificando, è possibile che molti dati vengano replicati. Si consideri che, sebbene la modifica della tabella possa essere eseguita in una singola istruzione, se 1 milione di righe sono interessate, verrà generato 1 milione di aggiornamenti nel Sottoscrittore, NON una singola istruzione di aggiornamento come si pensa comunemente.

Le mani sulla, il miglioramento delle prestazioni approccio .......

Per eseguire questo esercizio è necessario:

  1. Backup dell'ambiente di replica da scripting la vostra intera configurazione.
  2. rimuovere la tabella dalla replica a entrambi gli editori/abbonati
  3. aggiungere la colonna ad ogni Editore/abbonato.
  4. Applicare l'aggiornamento localmente a ciascun editore/sottoscrittore .
  5. Aggiungere nuovamente la tabella in Replica.
  6. Convalidare le transazioni replicate.