http://msdn.microsoft.com/it-it/library/ms190273.aspx
ALTER TABLE (Transact-SQL)
SQL Server 2008 R2
Modifica una definizione di tabella mediante la modifica, l'aggiunta o l'eliminazione di
colonne e vincoli, la riassegnazione di partizioni, la disabilitazione o l'abilitazione di vincoli e
trigger.
Convenzioni della sintassi Transact-SQL1
Sintassi
other
Copia
ALTER TABLE [ database_name . [ schema_name ] . | schema_name . ] table_name
{
ALTER COLUMN column_name
{
[ type_schema_name. ] type_name [ ( { precision [ ,scale ]
| max | xml_schema_collection } ) ]
[ COLLATE collation_name ]
[ NULL | NOT NULL ] [ SPARSE ]
| {ADD | DROP }
{ ROWGUIDCOL | PERSISTED | NOT FOR REPLICATION | SPARSE }
}
| [ WITH { CHECK | NOCHECK } ]
| ADD
{
<column_definition>
| <computed_column_definition>
| <table_constraint>
| <column_set_definition>
} [ ,...n ]
| DROP
{
[ CONSTRAINT ] constraint_name
[ WITH ( <drop_clustered_constraint_option> [ ,...n ] ) ]
| COLUMN column_name
} [ ,...n ]
| [ WITH { CHECK | NOCHECK } ] { CHECK | NOCHECK } CONSTRAINT
{ ALL | constraint_name [ ,...n ] }
| { ENABLE | DISABLE } TRIGGER
{ ALL | trigger_name [ ,...n ] }
| { ENABLE | DISABLE } CHANGE_TRACKING
[ WITH ( TRACK_COLUMNS_UPDATED = { ON | OFF } ) ]
| SWITCH [ PARTITION source_partition_number_expression ]
TO target_table
[ PARTITION target_partition_number_expression ]
| SET ( FILESTREAM_ON = { partition_scheme_name | filegroup |
"default" | "NULL" } )
| REBUILD
[ [PARTITION = ALL]
[ WITH ( <rebuild_option> [ ,...n ] ) ]
| [ PARTITION = partition_number
[ WITH ( <single_partition_rebuild_option> [ ,...n ] )]
]
]
| (<table_option>)
}
[ ; ]
other
Copia
<column_set_definition> ::=
column_set_name XML COLUMN_SET FOR ALL_SPARSE_COLUMNS
<drop_clustered_constraint_option> ::=
{
MAXDOP =max_degree_of_parallelism
| ONLINE = {ON | OFF }
| MOVE TO { partition_scheme_name (column_name) | filegroup
| "default" }
}
<table_option> ::=
{
SET ( LOCK_ESCALATION = { AUTO | TABLE | DISABLE } )
}
<single_partition_rebuild__option> ::=
{
SORT_IN_TEMPDB = { ON | OFF }
| MAXDOP =max_degree_of_parallelism
| DATA_COMPRESSION = { NONE | ROW | PAGE} }
}
Argomenti
database_name
Nome del database in cui è stata creata la tabella.
schema_name
Nome dello schema a cui appartiene la tabella.
table_name
Nome della tabella che si desidera modificare. Se la tabella non è inclusa nel
database corrente o nello schema di proprietà dell'utente corrente, è necessario
specificare in modo esplicito il database e lo schema.
ALTER COLUMN
Specifica che la colonna denominata deve essere cambiata o modificata. Per ulteriori
informazioni, vedere sp_dbcmptlevel (Transact -SQL)2 .
Non è consentita la modifica delle colonne seguenti:
Colonne con tipo di dati timestamp.
Colonna ROWGUIDCOL della tabella.
Colonne calcolate o utilizzate in una colonna calcolata.
Colonne utilizzate in un indice. Fanno eccezione le colonne per cui il tipo di dati è
varchar, nvarchar o varbinary oppure è rimasto invariato, le nuove dimensioni
sono uguali o maggiori di quelle precedenti e l'indice è diverso dal risultato di
un vincolo PRIMARY KEY.
Colonne utilizzate in statistiche generate dall'istruzione CREATE STATISTICS.
Fanno eccezione le colonne per cui il tipo di dati è varc har, nvarchar o
varbinary oppure è rimasto invariato e le nuove dimensioni sono uguali o
maggiori di quelle precedenti e le colonne modificate da non Null a Null. È
innanzitutto necessario rimuovere le statistiche utilizzando l'istruzione DROP
STATISTICS. Le statistiche generate in modo automatico da Query Optimizer
vengono eliminate automaticamente da ALTER COLUMN.
Colonne utilizzate in un vincolo PRIMARY KEY o [FOREIGN KEY] REFERENCES.
Colonne utilizzate in un vincolo CHECK o UNIQUE. È tuttavia possibile modificare la
lunghezza di una colonna a lunghezza variabile utilizzata in un vincolo CHECK o
UNIQUE.
Colonne associate a una definizione DEFAULT. Se il tipo di dati non viene
modificato, è tuttavia possibile modificare la lunghezza, la precisione o la sca la
di una colonna.
Il tipo di dati di colonne text, ntext e image può essere modificato solo nei
modi seguenti:
text in varchar(max), nvarchar(max) o xml
ntext in varchar(max), nvarchar(max) o xml
image in varbinary(max)
Alcune modifiche del tipo di dati possono comportare la modifica dei dati. La
sostituzione, ad esempio, del tipo di dati nchar o nvarchar di una colonna in
char o varchar può causare la conversione di caratteri estesi. Per ulteriori
informazioni, vedere CAST e CONVERT (Transact -SQL)3 . La riduzione della
precisione o della scala di una colonna può causare il troncamento dei dati.
Non è possibile modificare il tipo di dati di una colonna di una tabella
partizionata.
column_name
Nome della colonna che si desidera modificare, aggiungere o eliminare.
column_name può essere composto da un massimo di 128 caratteri. Nel caso di
nuove colonne create con il tipo di dati timestamp, è possibile omettere
column_name. Se per una colonna con tipo di dati timestamp non è specificato alcun
valore column_name, viene utilizzato il nome timestamp.
[ type_schema_name. ] type_name
Nuovo tipo di dati per la colonna modificata o tipo di dati per la colonna aggiunta.
Non è possibile specificare type_name per le colonne esistenti di tabelle partizionate.
type_name può appartenere a uno dei tipi seguenti:
Tipo di dati di sistema di SQL Server.
Tipo di dati alias basato su un tipo di dati di sistema di SQL Server. Per
consentirne l'utilizzo in una definizione di tabella, i tipi di dati alias vengono
creati con l'istruzione CREATE TYPE.
Tipo di dati definito dall'utente di .NET Framework e schema al quale il tipo di dati
appartiene. Per consentirne l'utilizzo in una definizione di tabella, i tipi di dati
definiti dall'utente di .NET Framework vengono creati con l'istruzione CREATE
TYPE.
Di seguito sono riportati i criteri per type_name di una colonna modificata:
Il tipo di dati precedente deve supportare la conversione implicita nel nuovo tipo di
dati.
type_name non può essere di tipo timestamp.
I valori predefiniti di ANSI_NULL sono sempre attivi per ALTER COLUMN. Se non
diversamente specificato, la colonna ammette valori Null.
Il riempimento con ANSI_PADDING è sempre attivo per ALTER COLUMN.
Se la colonna modificata è una colonna Identity, il tipo di dati di new_data_type
deve supportare la proprietà Identity.
L'impostazione corrente di SET ARITHABORT viene ignorata. Il funzionamento di
ALTER TABLE presume l'impostazione di ARITHABORT su ON.
Nota
Se la clausola COLLATE è omessa, la modifica del tipo di dati di una colonna
causerà la modifica delle regole di confronto predefinite del database.
precision
Precisione del tipo di dati specificato. Per ulteriori informazioni sui valori di precisione
validi, vedere Precisione, scala e lunghezza (Transact -SQL)4 .
scale
Scala del tipo di dati specificato. Per ulteriori informazioni sui valori di scala validi,
vedere Precisione, scala e lunghezza (Transact -SQL)4 .
max
Viene applicato solo ai tipi di dati varchar, nvarchar, e varbinary per l'archiviazione di
2^31-1 byte di dati di tipo carattere, binario e Unicode.
xml_schema_collection
Viene applicato solo al tipo di dati xml per l'associazione di uno XML Schema con il
tipo. Prima di tipizzare una colonna xml in una raccolta di schemi, è necessario
creare la raccolta nel database utilizzando CREATE XML SCHEMA COLLECTION5 .
COLLATE < collation_name >
Specifica le nuove regole di confront o per la colonna modificata. Se viene omesso,
alla colonna vengono assegnate le regole di confronto predefinite del database. È
possibile utilizzare nomi di regole di confronto di Windows o SQL. Per un elenco e
ulteriori informazioni, vedere Windows_collation_name (Transact -SQL)6 e Nome delle
regole di confronto di SQL Server (Transact -SQL)7 .
La clausola COLLATE consent e di modificare le regole di confronto solo delle colonne
del tipo di dati char, varchar, nchar e nvarchar. Per modificare le regole di confronto
di una colonna con un tipo di dati alias definito dall'utente, è necessario eseguire
istruzioni ALTER TABLE separate in modo da modificare il tipo di dati della colonna in
un tipo di dati di sistema di SQL Server e le relative regole di confronto. Si dovrà
quindi ripristinare un tipo di dati alias per la colonna.
Non è possibile specificare una modifica delle regole di confronto per ALTER COLUMN
se si verifica una delle condizioni seguenti:
Un vincolo CHECK o FOREIGN KEY o una colonna calcolata fa riferimento alla
colonna modificata.
Nella colonna viene creato un indice, un indice full-text o una serie di statist iche.
Le statistiche create automaticamente nella colonna modificata vengono
eliminate se si modificano le regole di confronto della colonna.
Una vista associata a schema o una funzione fa riferimento alla colonna.
Per ulteriori informazioni, vedere COLLATE (Transact-SQL)8 .
SPARSE NULL | NOT NULL
Specifica se la colonna è di tipo sparse o ammette valori Null. Se la colonna da
modificare è di tipo sparse, è necessario specificare in modo esplicito questa
proprietà. In caso contrario, viene ripristinata una colonna non di tipo sparse. Non è
possibile designare le colonne di tipo sparse come NOT NULL. La conversione di una
colonna di tipo sparse in una non di tipo sparse o viceversa provoca il blocco della
tabella per la durata dell'esecuzione del comando.
Per ulteriori restrizioni e informazioni relative alle colonne di tipo sparse e il supporto
di valori Null, vedere Utilizzo di colonne di tipo sparse 9 .
L'istruzione ALTER TABLE consente di aggiungere colonne che non consentono valori
Null solo se alle colonne è associato un valore predefinito oppure se la tabella è
vuota. È possibile specificare NOT NULL per le colonne calcolate solo se è specificato
PERSISTED. Le nuove colonne che consentono valori Null ma a cui non è associato
alcun valore predefinito contengono un valore Null per ogni riga della tabella. Se a
una nuova colonna che consente valori Null viene aggiunta una definizione DEFAULT,
è possibile utilizzare WITH VALUES per l'archiviazione del valore predefinito nella
nuova colonna per ogni riga della tabella.
Se la nuova colonna non consente valori Null e la tabella non è vuota, è necessario
aggiungervi una definizione DEFAULT. Il valore predefinito viene quindi caricato
automaticamente in ogni riga esistente della nuova colonna.
È possibile specificare NULL in ALTER COLUMN per forzare l'utilizzo di valori Null nelle
colonne NOT NULL, ad eccezione delle colonne nei vincoli PRIMARY KEY. È possibile
specificare NOT NULL in ALTER COLUMN solo se la colonna non contiene valori Null.
Per utilizzare ALTER COLUMN NOT NULL, è necessario aggiornare i valori Null con un
valore specifico, ad esempio:
other
Copia
UPDATE MyTable SET NullCol = N'some_value' WHERE NullCol IS NULL
ALTER TABLE MyTable ALTER COLUMN NullCOl NVARCHAR(20) NOT NULL
Quando si crea o si modifica una tabella mediante un'istruzione CREATE TABLE o
ALTER TABLE, le impostazioni del database e della sessione influiscono
sull'impostazione che consente l'utilizzo dei valori Null del tipo di dati utilizzato in una
definizione di colonna. In questo caso, tale impostazione può essere sostituita. Nel
caso di colonne non calcolate, è consigliabile definire sempre in modo esplicito una
colonna come NULL o NOT NULL.
Se si aggiunge una colonna con un tipo di dati definito dall'utente, è consigliabile
definire per la colonna la stessa impostazione relativa al supporto di valori Null del
tipo di dati definito dall'utente e specificare un valore predefinito per la colonna. Per
ulteriori informazioni, vedere CREATE TABLE (Transact -SQL)1 0.
Nota
Se si specifica NULL o NOT NULL con ALTER COLUMN, è necessario inoltre
specificare new_data_type [(precision [, scale ])]. Se il tipo di dati, la precisione e
la scala non vengono modificati, specificare i valori correnti della colonna.
[ {ADD | DROP} ROWGUIDCOL ]
Specifica l'aggiunta o l'eliminazione della proprietà ROWGUIDCOL dalla colonna
specificata. ROWGUIDCOL indica che la colonna è di tipo rowguid. È possibile
designare come colonna ROWGUIDCOL una sola colonna uniqueidentifier per tabella
e assegnare la proprietà ROWGUIDCOL a una sola colonna uniqueidentifier. Non è
possibile assegnare ROWGUIDCOL a una colonna con un tipo di dati definito
dall'utente.
ROWGUIDCOL non impone l'unicità dei valori archiviati nella colonna e non genera
automaticamente valori per le nuove righe inserite nella tabella. Per generare valori
univoci per ogni colonna, è necessario utilizzare la funzione NEWID con istruzioni
INSERT o specificare la funzione NEWID come valore predefinito della colonna.
[ {ADD | DROP} PERSISTED ]
Specifica l'aggiunta o l'eliminazione della proprietà PERSISTED dalla colonna
specificata. La colonna interessat a deve essere una colonna calcolata definita con
un'espressione deterministica. Per le colonne specificate come PERSISTED, Motore di
database archivia fisicamente i valori calcolati nella tabella e aggiorna i valori
durante l'aggiornamento delle altre colonne da cui le colonne calcolate dipendono. Se
si contrassegna una colonna calcolata come PERSISTED, è possibile creare indici in
colonne calcolate definite in base a espressioni deterministiche ma imprecise. Per
ulteriori informazioni, vedere Creazione di indici per le colonne calcolate 1 1.
Tutte le colonne calcolate utilizzate come colonne di partizionamento di tabelle
partizionate devono essere contrassegnate come PERSISTED in modo esplicito.
DROP NOT FOR REPLICATION
Specifica che i valori vengono incrementati nelle colonne Identity quando gli agenti di
replica eseguono operazioni di inserimento. Questa clausola può essere specificata
solo se column_name è una colonna Identity. Per ulteriori informazioni, vedere
Controllo di vincoli, identità e trigger con l'opzione NOT FOR REPLICATION1 2 .
SPARSE
Specifica che la colonna da aggiungere o da eliminare è di tipo sparse.
L'archiviazione delle colonne di tipo sparse è ottimizzata per i valori Null. Non è
possibile designare le c olonne di tipo sparse come NOT NULL. La conversione di una
colonna di tipo sparse in una non di tipo sparse o viceversa provoca il blocco della
tabella per la durata dell'esecuzione del comando.
Nota
È necessario specificare la proprietà SPARSE ogni volta che si modifica la colonna.
In caso contrario, viene ripristinata una colonna non di tipo sparse.
Per ulteriori restrizioni e informazioni relative alle colonne di tipo sparse, vedere
Utilizzo di colonne di tipo sparse 9 .
WITH CHECK | WITH NOCHECK
Specifica se i dati nella tabella vengono convalidati in base a un vincolo FOREIGN
KEY o CHECK nuovo o riabilitato. Se viene omesso, viene utilizzata la clausola WITH
CHECK per nuovi vinc oli e WITH NOCHECK per vincoli riattivati.
Se non si desidera verificare nuovi vincoli CHECK o FOREIGN KEY in base ai dati
esistenti, utilizzare WITH NOCHECK. È tuttavia consigliabile effettuare questa scelta
solo in casi rari. Il nuovo vincolo viene valut ato in tutti gli aggiornamenti successivi
dei dati. Le eventuali violazioni del vincolo soppresse da WITH NOCHECK quando si
aggiunge il vincolo possono causare il mancato completamento dei successivi
aggiornamenti di righe contenenti dati che violano il vincolo.
Query Optimizer non considera i vincoli definiti con WITH NOCHECK, i quali vengono
ignorati finché non vengono riattivati mediante ALTER TABLE <table> WITH CHECK
CHECK CONSTRAINT ALL.
ADD
Specifica l'aggiunta di una o più definizioni di colonna, definizioni di colonna calcolata
o vincoli di tabella.
DROP { [ CONSTRAINT ] constraint_name | COLUMN column_name }
Specifica che constraint_name o column_name viene rimosso dalla tabella. È
possibile elencare più colonne e vincoli.
Il nome del vincolo definito dall'utente o fornito dal sistema può essere determinato
eseguendo una query nelle viste del catalogo sys.check_constraint,
sys.default_constraints, sys.key_constraints e sys.foreign_keys.
Se nella tabella è presente un indice XML, non è possibile eliminare un vincolo
PRIMARY KEY.
Non è possibile eliminare una colonna se:
Viene utilizzata in un indice.
Viene utilizzata in un vincolo CHECK, FOREIGN KEY, UNIQUE o PRIMARY KEY.
È associata a un valore predefinito creato con la parola chiave DEFAULT o a un
oggetto predefinito.
È associata a una regola.
Nota
L'eliminazione di una colonna non consente di recuperare lo spazio su disco
corrispondente. Può essere necessario recuperare lo spazio su disco di una colonna
rimossa quando le dimensioni delle righe della tabella sono prossime al limite o lo
hanno superato. Per recuperare spazio, creare in indice cluster nella tabella o
ricompilare un indice cluster esistente utilizzando ALTER INDEX1 3 .
WITH <drop_clustered_constraint_option>
Specifica l'impostazione di una o più opzioni di eliminazione dei vincoli cluster.
MAXDOP = max_degree_of_parallelism
Consente di ignorare l'opzione di configurazione max degree of parallelism solo per la
durata dell'operazione. Per ulteriori informazioni, vedere Opzione max degree of
parallelism1 4 .
L'opzione MAXDOP consente di limitare il numero di processori utilizzati per
l'esecuzione di piani paralleli. Il valore massimo è 64 processori.
I possibili valori di max_degree_of_parallelism sono i seguenti:
1
Disattiva la generazione di piani paralleli.
>1
Limita il numero massimo di processori utilizzati in un'operazione parallela sull'indice
in base al numero specificato.
0 (predefinito)
Utilizza il numero effettivo di processori o un numero inferiore in base al carico di
lavoro corrente del sistema.
Per ulteriori informazioni, vedere Configurazione di operazioni parallele sugli indici1 5 .
Nota
Le operazioni parallele sugli indici sono disponibili solo nelle edizioni Enterprise,
Developer ed Evaluation di SQL Server.
ONLINE = { ON | OFF }
Specifica se le tabelle sottostanti e gli indici associati sono disponibili per le query e
per la modifica dei dati durante l'operazione sull'indice. Il valore predefinito è OFF.
L'opzione REBUILD può essere eseguita come operazione ONLINE.
ON
I blocchi di tabella a lungo termine non vengono mantenuti per la durata
dell'operazione sull'indice. Durante la fase principale dell'operazione viene mantenuto
solo un blocco preventivo condiviso (IS, Intent Shared) sulla tabella di origine, in
modo da consentire l'esecuzione di query o l'aggiornamento della tabella sottostante
e degli indici. All'inizio dell'operazione viene mantenuto un blocco condiviso (S)
sull'oggetto di origine per un periodo molto breve. Al termine dell'operazione di
creazione di un indice non cluster, per un breve periodo viene acquisito un blocco
condiviso (S) sull'origine. Al termine dell'operazione di creazione o di eliminazione di
un indice cluster online o di ricompilazione di un indice cluster o non cluster, viene
acquisito un blocco di modifica dello schema (SCH-M). Durante la creazione di un
indice per una tabella temporanea locale non è possibile impostare ONLINE su ON. È
consentita solo l'operazione di ricompilazione di HEAP a thread singolo.
OFF
I blocchi a livello di tabella vengono applicati per la durata dell'operazione sugli
indici. Un'operazione sugli indici offline che crea, ricompila o elimina un indice cluster
oppure ricompila o elimina un indice non cluster acquisisce un blocco di modifica
dello schema (SCH-M) sulla tabella. Tale blocco impedisce agli utenti di accedere alla
tabella sottostante per la durata dell'operazione. Un'operazione sugli indici offline che
crea un indice non cluster acquisisce un blocco condiviso (S) sulla tabella. Tale blocco
impedisce l'aggiornamento della tabella sottostante ma consente operazioni di
lettura, ad esempio l'esecuzione di istruzioni SELECT. Consente operazioni di
ricompilazione di HEAP multithread.
Per ulteriori informazioni, vedere Funzionamento delle operazioni sugli indici in
linea1 6 . Per ulteriori informazioni sui blocchi, vedere Modalità blocco1 7.
Nota
Le operazioni sugli indici online sono disponibili solo in alcune edizioni di SQL
Server. Per ulteriori informazioni, vedere Caratteristiche supportate dalle edizioni di
SQL Server 2008 R21 8 .
MOVE TO { partition_scheme_name(column_name [ 1, ... n] ) | filegroup | "default" }
Specifica una posizione in cui spostare le righe di dati attualmente presenti a livello
foglia nell'indice cluster. La tabella viene spostata nella nuova posizione. Questa
opzione è valida solo per i vincoli che creano un indice cluster.
Nota
In questo contesto, default non è una parola chiave, ma un identificatore per il
filegroup predefinito e deve essere delimitato, come in MOVE TO "default" o MOVE
TO [default]. Se si specifica "default", l'opzione QUOTED_IDENTIFIER deve essere
impostata su ON per la sessione corrente. Questa è l'impostazione predefinita. Per
ulteriori informazioni, vedere SET QUOTED_IDENTIFIER (Transact -SQL)19.
{ CHECK | NOCHECK } CONSTRAINT
Specifica l'attivazione o la disabilitazione di constraint_name. È possibile utilizzare
questa opzione solo con vincoli FOREIGN KEY e CHECK. Quando si specifica
NOCHECK, il vincolo viene disabilitato e gli inserimenti o gli aggiornamenti successivi
della c olonna non vengono convalidati in base alle condizioni del vincolo. I vincoli
DEFAULT, PRIMARY KEY e UNIQUE non possono essere disabilitati.
ALL
Specifica che tutti i vincoli sono disabilitati con l'opzione NOCHECK o attivati con
l'opzione CHECK.
{ ENABLE | DISABLE } TRIGGER
Specifica l'attivazione o la disabilitazione di trigger_name. Un trigger disabilitato è
comunque disponibile nella tabella. Quando si esegue un'istruzione INSERT, UPDATE
o DELETE sulla tabella, tuttavia, le azioni nel trigger vengono eseguite solo dopo la
riattivazione del trigger stesso.
ALL
Specifica l'abilitazione o la disabilitazione di tutti i trigger della tabella.
trigger_name
Specifica il nome del trigger da abilitare o disabilitare.
{ ENABLE | DISABLE } CHANGE_TRACKING
Specifica se il rilevamento delle modifiche è abilitato o disabilitato per la tabella. Per
impostazione predefinita, il rilevamento delle modifiche è disabilitato.
Questa opzione è disponibile solo quando il rilevamento delle modifiche è abilitato
per il database. Per ulteriori informazioni, vedere Opzioni ALTER DATABASE SET
(Transact-SQL)2 0.
Per abilitare il rilevamento delle modifiche, nella tabella deve essere presente una
chiave primaria.
WITH ( TRACK_COLUMNS_UPDATED = { ON | OFF } )
Specifica se nel Motore di database viene tenuta traccia delle colonne con
rilevamento delle modifiche abilitato che sono state aggiornate. Il valore predefinito
è OFF.
SWITCH [ PARTITION source_partition_number_expression ] TO [ schema_name. ]
target_table [ PARTITION target_ partition_number_expression ]
Trasferisce un blocco di dati in uno dei modi seguenti:
Riassegna tutti i dati di una tabella come partizione a una tabella partizionata già
esistente.
Sposta una partizione da una tabella partizionata a un'altra.
Riassegna tutti i dati in una partizione di una tabella partizionata a una tabella non
partizionata esistente.
Se table è una tabella partizionata, è necessario specificare
source_partition_number_expression. Se target_table è partizionata, è necessario
specificare target_partition_number_expression. Se si riassegnano i dati di una
tabella come partizione a una tabella esistente già partizionata o se si sposta una
partizione da una tabella partizionata a un'altra, la partizione di destinazione deve
essere già esistente e vuota.
Se si riassegnano i dati di una partizione per formare un'unica tabella, la tabella di
destinazione deve essere già stata creata ed essere vuot a. Sia la tabella o la
partizione di origine che la tabella o la partizione di destinazione devono trovarsi
nello stesso filegroup. È inoltre necessario che gli indici o le partizioni degli indici
corrispondenti si trovino nello stesso filegroup. Al trasferimento di partizioni vengono
applicate molte ulteriori restrizioni. Per ulteriori informazioni, vedere Trasferimento
efficiente dei dati mediante lo spostamento di partizioni 2 1 . table e target_table non
possono essere uguali. target_table può essere un identificatore in più parti.
source_partition_number_expression e target_partition_number_expression sono
espressioni costanti che possono fare riferimento a variabili e funzioni, incluse
variabili con tipo definito dall'utente e funzioni definite dall'utente, ma che non
possono fare riferimento a espressioni Transact -SQL.
SET ( FILESTREAM_ON = { partition_scheme_name | filestream_filegroup_name | "default"
| "NULL"} )
Specifica la posizione in cui vengono archiviati i dati FILESTREAM.
L'istruzione ALTER TABLE con la clausola SET FILESTREAM_ON verrà eseguita in
modo corretto solo se nella tabella non sono presenti colonne FILESTREAM. Tali
colonne possono essere aggiunte tramite una seconda istruzione ALTER TABLE.
Se partition_scheme_name è specificato, vengono applicate le regole per CREATE
TABLE1 0 . La tabella deve già essere partizionata per i dati delle righe e nel relativo
schema di partizione devono essere utilizzate la stessa funzione e le stesse colonne
di partizione dello schema di partizione FILESTREAM.
filestream_filegroup_name specifica il nome di un filegroup FILESTREAM. È
necessario che per il filegroup sia definito un file mediante un'istruzione CREATE
DATABASE2 2 o ALTER DATABASE2 3 . In caso contrario, viene generato un errore.
"default" specifica il filegroup FILESTREAM con il set di proprietà DEFAULT. Se non è
presente alcun filegroup FILESTREAM, viene generato un errore.
"NULL" specifica che tutti i riferimenti al filegroup FILESTREAM per la tabella
verranno rimossi. È necessario eliminare innanzitutto tutte le colonne FILESTREAM. È
necessario inoltre utilizzare SET FILESTREAM_ON="NULL" per eliminare tutti i dati
FILESTREAM associati a una tabella.
SET ( LOCK_ESCALATION = { AUTO | TABLE | DISABLE } )
Specifica i metodi consentiti di escalation blocchi per una tabella.
AUTO
Questa opzione consente al Motore di database di SQL Server di selezionare la
granularità dell'escalation blocchi appropriata per lo schema della tabella.
Se la tabella è partizionata, l'escalation blocchi è consentita per la partizione. Una
volta eseguita l'escalation del blocco al livello di partizione, non verrà eseguita
alcuna successiva escalation del blocco nella granularità TABLE.
Se la tabella non è partizionata, l'escalation blocchi verrà eseguita nella granularità
TABLE.
TABLE
L'escalation blocchi viene eseguita con una granularità a livello di tabella,
indipendentemente dal partizionamento o meno della tabella. Questo avviene anche
in SQL Server 2005. TABLE rappresenta il valore predefinito.
DISABLE
Evita che venga eseguita l'escalation blocchi nella maggior parte dei casi. I blocchi a
livello di tabella non vengono completamente disattivati. Quando si esegue l'analisi di
una tabella in cui non è presente alcun indice cluster a livello di is olamento
serializzabile, ad esempio, il Motore di database deve acquisire un blocco di tabella
per proteggere l'integrità dei dati.
REBUILD
Utilizzare la sintassi REBUILD WITH per ricompilare un'intera tabella che include tutte
le partizioni in una tabella partizionata. Se nella tabella è presente un indice cluster,
l'opzione REBUILD consente di ricompilare l'indice stesso. L'opzione REBUILD può
essere eseguita come operazione ONLINE.
Utilizzare la sintassi REBUILD PARTITION per ricompilare un'unica partizione in una
tabella partizionata.
PARTITION = ALL
Ricompila tutte le partizioni in caso di modifica delle impostazioni di compressione
della partizione.
REBUILD WITH ( <rebuild_option> )
Tutte le opzioni vengono applicate a una tabella con un indice cluster. Se nella
tabella non è presente un indice cluster, sulla struttura di heap influiranno solo
alcune opzioni.
Per una descrizione completa delle opzioni di ricompilazione, vedere index_option
(Transact-SQL)2 4.
DATA_COMPRESSION
Specifica l'opzione di compressione dei dati per la tabella, il numero di partizione o
l'intervallo di partizioni specificato. Sono disponibili le opzioni seguenti:
NONE
La tabella o le partizioni specificate non vengono compresse.
ROW
La tabella o le partizioni specificate vengono compresse utilizzando la compressione
di riga.
PAGE
La tabella o le partizioni specificate vengono compresse utilizzando la compressione
di pagina.
Per ricompilare contemporaneamente più partizioni, vedere index_option (TransactSQL)2 4 . Se la tabella non dispone di un indice cluster, la modifica della compressione
dei dati ricompila l'heap e gli indici non cluster. Per ulteriori informazioni sulla
compressione, vedere Creazione di tabelle e di indici compressi2 5 e Cenni preliminari
sulla Compressione UNICODE2 6 .
column_set_name XML COLUMN_SET FOR ALL_SPARSE_COLUMNS
Nome del set di colonne. Un set di colonne è una rappresentazione XML non tipizzata
che combina tutte le colonne di tipo sparse di una tabella in un output strutturato.
Un set di colonne non può essere aggiunto a una tabella che contiene colonne di tipo
sparse. Per ulteriori informazioni sui set di colonne, vedere Utilizzo di set di
colonne 2 7 .
Osservazioni
Se la cache delle procedure include piani di esecuzione che fanno riferimento alla tabella,
l'istruzione ALTER TABLE li contrassegna per la ricompilazione durante l'esecuzione
successiva.
Modifica delle dimensioni di una colonna
È possibile modificare la lunghezza, la precisione o la scala di una colonna specificando
nuove dimensioni per il tipo di dati della colonna nella clausola ALTER COLUMN. Se nella
colonna sono presenti dati, le nuove dimensioni non possono essere minori delle dimensioni
massime dei dati. La colonna inoltre non può essere definita in un indice, tranne nel caso in
cui il tipo di dati della colonna sia varchar, nvarchar o varbinary e l'indice sia diverso dal
risultato di un vincolo PRIMARY KEY. Vedere l'esempio P.
Blocchi e ALTER TABLE
Le modifiche specificate in ALTER TABLE vengono implementate immediatamente. Se le
modifiche richiedono l'alterazione delle righe nella tabella, le righe vengono aggiornate
tramite ALTER TABLE. ALTER TABLE acquisisce un blocco di modifica dello schema (SCH-M)
sulla tabella per verificare che durante la modifica nessun'altra connessione faccia
riferimento ai dati o ai metadati della tabella, ad eccezione delle operazioni sugli indici
online al termine delle quali è richiesto un blocco SCH-M molto breve. In un'operazione
ALTER TABLE…SWITCH il blocco viene acquisito sia sulle tabelle di origine che su quelle di
destinazione. Le modifiche apportate alla tabella vengono registrate e possono essere
recuperate completamente. Le modifiche che influiscono su tutte le righe di tabelle di grandi
dimensioni, ad esempio l'eliminazione di una colonna o l'aggiunta di una colonna NOT NULL
con valore predefinito, possono richiedere molto tempo e generare un elevato numero di
record del log. Tali istruzioni ALTER TABLE devono essere eseguite con la stessa attenzione
dedicata alle istruzioni INSERT, UPDATE e DELETE quando queste influiscono su molte righe.
Esecuzione di piani paralleli
In SQL Server 2008 Enterprise Edition il numero di processori utilizzati per eseguire un'unica
istruzione ALTER TABLE ADD (basata su indici) CONSTRAINT o DROP (indice cluster)
CONSTRAINT viene determinato dall'opzione di configurazione max degree of parallelism e
dal carico di lavoro corrente. Se Motore di database rileva che il sistema è occupato, il grado
di parallelismo dell'operazione viene ridotto automaticamente prima dell'avvio
dell'esecuzione dell'istruzione. È possibile configurare manualmente il numero di processori
utilizzati per eseguire l'istruzione mediante l'opzione MAXDOP.
Tabelle partizionate
Oltre all'esecuzione di operazioni SWITCH che interessano tabelle partizionate, è possibile
utilizzare ALTER TABLE per modificare lo stato di colonne, vincoli e trigger di tali tabelle così
come per le tabelle non partizionate. Non è tuttavia possibile utilizzare questa istruzione per
modificare il modo di partizione della tabella stessa. Per ripartizionare una tabella
partizionata, utilizzare ALTER PARTITION SCHEME2 8 e ALTER PARTITION FUNCTION2 9 . Non è
inoltre possibile modificare il tipo di dati di una colonna di una tabella partizionata.
Restrizioni per le tabelle con viste associate a schema
Le restrizioni che si applicano a istruzioni ALTER TABLE eseguite su tabelle con viste
associate a schema sono le stesse che vengono applicate alla modifica di tabelle con un
indice semplice. È possibile aggiungere una colonna mentre non è consentito rimuovere o
modificare una colonna che fa parte di una vista associata a schema. Se l'istruzione ALTER
TABLE richiede la modifica di una colonna utilizzata in una vista associata allo schema,
ALTER TABLE ha esito negativo e Motore di database genera un messaggio di errore. Per
ulteriori informazioni sull'associazione di schema e sulle viste indicizzate, vedere CREATE
VIEW (Transact-SQL)3 0.
La creazione di una vista associata a schema che fa riferimento a tabelle di base non
influisce sull'aggiunta o sulla rimozione di trigger in tali tabelle.
Indici e ALTER TABLE
Gli indici creati nell'ambito di un vincolo vengono eliminati con l'eliminazione del vincolo. Gli
indici creati mediante CREATE INDEX devono essere eliminati mediante DROP INDEX. È
possibile utilizzare l'istruzione ALTER INDEX per ricompilare un indice che costituisce una
parte di una definizione di vincolo. Non è necessario eliminare e quindi aggiungere
nuovamente il vincolo con ALTER TABLE.
Tutti gli indici e i vincoli basati su una colonna devono essere rimossi prima della rimozione
della colonna.
Quando si elimina un vincolo con cui è stato creato un indice cluster, le righe di dati
archiviate a livello foglia nell'indice cluster vengono archiviate in una tabella non cluster. È
possibile eliminare l'indice cluster e spostare la tabella risultante in un altro filegroup o
schema di partizione in una singola transazione specificando l'opzione MOVE TO. Per
l'opzione MOVE TO vengono applicate le seguenti restrizioni:
MOVE TO non può essere utilizzata per viste indicizzate o indici non cluster.
Lo schema di partizione o il filegroup deve essere già esistente.
Se non si specifica MOVE TO, la tabella viene inserita nello stesso schema di partizione o
nello stesso filegroup definito per l'indice cluster.
Quando si elimina un indice cluster, è possibile specificare l'opzione ONLINE = ON per
evitare che la transazione DROP INDEX blocchi l'esecuzione di query e modifiche sui dati
sottostanti e gli indici non cluster associati.
Per l'opzione ONLINE = ON vengono applicate le seguenti restrizioni:
ONLINE = ON non è valida per gli indici cluster che sono inoltre disabilitati. Per
l'eliminazione degli indici disabilitati è necessario utilizzare ONLINE = OFF.
È possibile eliminare un solo indice alla volta.
ONLINE = ON non è valida per viste indicizzate, indici non cluster o indici su tabelle
temporanee locali.
Per l'eliminazione di un indice cluster, lo spazio su disco temporaneo deve essere uguale alle
dimensioni dell'indice cluster esistente. Questo spazio aggiuntivo viene rilasciato al termine
dell'operazione.
Nota
Le opzioni elencate in <drop_clustered_constraint_option> si applicano a indici cluster
nelle tabelle e non possono essere applicate a indici cluster nelle viste o a indici non
cluster.
Replica delle modifiche dello schema
Per impostazione predefinita, quando si esegue ALTER TABLE su una tabella pubblicata in un
server di pubblicazione SQL Server tale modifica viene propagata a tutti i Sottoscrittori SQL
Server. Questa funzionalità presenta alcune restrizioni e può essere disabilitata. Per ulteriori
informazioni, vedere Modifiche allo schema nei database di pubblicazione 3 1 .
Compressione dei dati
Le tabelle di sistema non possono essere abilitate per la compressione. Se la tabella è un
heap, l'operazione di ricompilazione per la modalità ONLINE sarà a thread singolo. Utilizzare
la modalità OFFLINE per un'operazione di ricompilazione di heap multithread. Per ulteriori
informazioni sulla compressione dei dati, vedere Creazione di tabelle e di indici compressi2 5 .
Per valutare il modo in cui la modifica dello stato di compressione influirà su una tabella, un
indice o una partizione, utilizzare la stored procedure
sp_estimate_data_compression_savings 3 2 .
Alle tabelle partizionate vengono applicate le restrizioni seguenti:
Non è possibile modificare l'impostazione di compressione di una singola partizione se la
tabella include indici non allineati.
La sintassi ALTER TABLE <tabella> REBUILD PARTITION ... consente di ricompilare la
partizione specifica.
La sintassi ALTER TABLE <tabella> REBUILD WITH ... consente di ricompilare tutte le
partizioni.
Autorizzazioni
È necessario disporre dell'autorizzazione ALTER per la tabella.
Le autorizzazioni ALTER TABLE si applicano a entrambe le tabelle coinvolte in un'istruzione
ALTER TABLE SWITCH. Tutti i dati trasferiti ereditano la sicurezza della tabella di
destinazione.
Se nell'istruzione ALTER TABLE si definiscono colonne di tipo Common Language Runtime
(CLR) definito dall'utente o di tipo alias, è necessaria l'autorizzazione REFERENCES per il
tipo desiderato.
Esempi
A. Aggiunta di una nuova colonna
Nell'esempio seguente viene aggiunta una colonna che consente valori Null e alla quale non
sono associati valori mediante una definizione DEFAULT. In ogni riga della nuova colonna
sarà indicato NULL.
SQL
Copia
CREATE TABLE dbo.doc_exa (column_a INT) ;
GO
ALTER TABLE dbo.doc_exa ADD column_b VARCHAR(20) NULL ;
GO
EXEC sp_help doc_exa ;
GO
DROP TABLE dbo.doc_exa ;
GO
B. Eliminazione di una colonna
Nell'esempio seguente viene modificata una tabella mediante la rimozione di una colonna.
SQL
Copia
CREATE TABLE dbo.doc_exb (column_a INT, column_b VARCHAR(20) NULL) ;
GO
ALTER TABLE dbo.doc_exb DROP COLUMN colu mn_b ;
GO
EXEC sp_help doc_exb ;
GO
DROP TABLE dbo.doc_exb ;
GO
C. Modifica del tipo di dati di una colonna
Nell'esempio seguente la colonna di una tabella viene modificata da INT a DECIMAL.
SQL
Copia
CREATE TABLE dbo.doc_exy (column_a INT ) ;
GO
INSERT INTO dbo.doc_exy (column_a) VALUES (10) ;
GO
ALTER TABLE dbo.doc_exy ALTER COLUMN column_a DECIMAL (5, 2) ;
GO
DROP TABLE dbo.doc_exy ;
GO
D. Aggiunta di una colonna con un vincolo
Nell'esempio seguente viene aggiunta una nuova colonna con un vincolo UNIQUE.
SQL
Copia
CREATE TABLE dbo.doc_exc (column_a INT) ;
GO
ALTER TABLE dbo.doc_exc ADD column_b VARCHAR(20) NULL
CONSTRAINT exb_unique UNIQUE ;
GO
EXEC sp_help doc_exc ;
GO
DROP TABLE dbo.doc_exc ;
GO
E. Aggiunta di un vincolo CHECK non verificato a una colonna esistente
Nell'esempio seguente viene aggiunto un vincolo a una colonna esistente nella tabella. Nella
colonna è presente un valore che viola il vincolo. Pertanto, viene utilizzato WITH NOCHECK
per evitare che il vincolo venga convalidato in base alle righe esistenti e consentire
l'aggiunta del vincolo.
SQL
Copia
CREATE TABLE dbo.doc_exd ( column_a INT) ;
GO
INSERT INTO dbo.doc_exd VALUES (-1) ;
GO
ALTER TABLE dbo.doc_exd WITH NOCHECK
ADD CONSTRAINT exd_check CHECK (column_a > 1) ;
GO
EXEC sp_help doc_exd ;
GO
DROP TABLE dbo.doc_exd ;
GO
F. Aggiunta di un vincolo DEFAULT a una colonna esistente
Nell'esempio seguente viene creata una tabella con due colonne e viene inserito un valore
nella prima colonna mentre i valori nell'altra colonna rimangono NULL. Viene quindi
aggiunto un vincolo DEFAULT alla seconda colonna. Per verificare l'applicazione del vincolo,
viene inserito un altro valore nella prima colonna e viene eseguita una query sulla tabella.
SQL
Copia
CREATE TABLE dbo.doc_exz ( column_a INT, column_b INT) ;
GO
INSERT INTO dbo.doc_exz (column_a)VALUES ( 7 ) ;
GO
ALTER TABLE dbo.doc_exz
ADD CONSTRAINT col_b_def
DEFAULT 50 FOR column_b ;
GO
INSERT INTO dbo.doc_exz (column_a) VALUES ( 10 ) ;
GO
SELECT * FROM dbo.doc_exz ;
GO
DROP TABLE dbo.doc_exz ;
GO
G. Aggiunta di più colonne con vincoli
Nell'esempio seguente vengono aggiunte più colonne con vincoli. I vincoli vengono definiti
con la nuova colonna. Alla prima colonna è associata la proprietà IDENTITY. Nella colonna
Identity di ogni riga della tabella sono presenti nuovi valori incrementali.
SQL
Copia
CREATE TABLE dbo.doc_exe ( column_a INT CONSTRAINT column_a_un UNIQUE) ;
GO
ALTER TABLE dbo.doc_exe ADD
-- Add a PRIMARY KEY identity column.
column_b INT IDENTITY
CONSTRAINT column_b_pk PRIMARY KEY,
-- Add a column that references another column in the same table.
column_c INT NULL
CONSTRAINT column_c_fk
REFERENCES doc_exe(column_a),
-- Add a column with a constraint to enforce that
-- nonnull data is in a valid telephone number format.
column_d VARCHAR(16) NULL
CONSTRAINT column_d_chk
CHECK
(column_d LIKE '[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]' OR
column_d LIKE
'([0-9][0-9][0-9]) [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]'),
-- Add a nonnull column with a default.
column_e DECIMAL(3,3)
CONSTRAINT column_e_default
DEFAULT .081 ;
GO
EXEC sp_help doc_exe ;
GO
DROP TABLE dbo.doc_exe ;
GO
H. Aggiunta di una colonna che ammette valori Null con valori predefiniti
Nell'esempio seguente viene aggiunta una colonna che ammette valori Null con una
definizione DEFAULT e viene specificato WITH VALUES per l'assegnazione di valori a ogni
riga della tabella. Se non si utilizza WITH VALUES, a ogni riga della nuova colonna viene
associato il valore NULL.
SQL
Copia
USE AdventureWorks2008R2 ;
GO
CREATE TABLE dbo.doc_exf ( column_a INT) ;
GO
INSERT INTO dbo.doc_exf VALUES (1) ;
GO
ALTER TABLE dbo.doc_exf
ADD AddDate smalldatetime NULL
CONSTRAINT AddDateDflt
DEFAULT GETDATE() WITH VALUES ;
GO
DROP TABLE dbo.doc_exf ;
GO
I. Disabilitazione e riabilitazione di un vincolo
Nell'esempio seguente viene disabilitato un vincolo che limita i dati relativi agli stipendi
accettabili. Viene inoltre utilizzato NOCHECK CONSTRAINT con ALTER TABLE per disabilitare
il vincolo e consentire un inserimento che altrimenti violerebbe il vinc olo. CHECK
CONSTRAINT riabilita il vincolo.
SQL
Copia
CREATE TABLE dbo.cnst_example
(id INT NOT NULL,
name VARCHAR(10) NOT NULL,
salary MONEY NOT NULL
CONSTRAINT salary_cap CHECK (salary < 100000)
);
-- Valid inserts
INSERT INTO dbo.cnst_example VALUES (1,'Joe Brown',65000);
INSERT INTO dbo.cnst_example VALUES (2,'Mary Smith',75000);
-- This insert violates the constraint.
INSERT INTO dbo.cnst_example VALUES (3,'Pat Jones',105000);
-- Disable the constraint and try again.
ALTER TABLE dbo.cnst_example NOCHECK CONSTRAINT salary_cap;
INSERT INTO dbo.cnst_example VALUES (3,'Pat Jones',105000);
-- Re-enable the constraint and try another insert; this will fail.
ALTER TABLE dbo.cnst_example CHECK CONSTRAINT salary_cap;
INSERT INTO dbo.cnst_example VALUES (4,'Eric James',110000) ;
J. Eliminazione di un vincolo
Nell'esempio seguente viene rimosso un vincolo UNIQUE da una tabella.
SQL
Copia
CREATE TABLE dbo.doc_exc ( column_a INT
CONSTRAINT my_constraint UNIQUE) ;
GO
ALTER TABLE dbo.doc_exc DROP CONSTRAINT my_constraint ;
GO
DROP TABLE dbo.doc_exc ;
GO
K. Trasferimento di partizioni tra tabelle
Nell'esempio seguente viene creata una tabella partizionata, presupponendo che nel
database sia già stato creato lo schema di partizione myRangePS1. Verrà quindi creata una
tabella non partizionata con la stessa struttura della tabella partizionata e nello stesso
filegroup di PARTITION 2 della tabella PartitionTable. I dati di PARTITION 2 della tabella
PartitionTable vengono quindi trasferiti nella tabella NonPartitionTable.
other
Copia
CREATE TABLE PartitionTable (col1 int, col2 char(10))
ON myRangePS1 (col1) ;
GO
CREATE TABLE NonPartitionTable (col1 int, col2 char(10))
ON test2fg ;
GO
ALTER TABLE PartitionTable SWITCH PARTITION 2 TO NonPartitionTable ;
GO
L. Disabilitazione e riabilitazione di un trigger
Nell'esempio seguente viene utilizzata l'opzione DISABLE TRIGGER di ALTER TABLE per
disabilitare il trigger e consentire un inserimento che altrimenti violerebbe il trigger. Per
riabilitare il trigger viene quindi utilizzato ENABLE TRIGGER.
SQL
Copia
CREATE TABLE dbo.trig_example
(id INT,
name VARCHAR(12),
salary MONEY) ;
GO
-- Create the trigger.
CREATE TRIGGER dbo.trig1 ON dbo.trig_example FOR INSERT
AS
IF (SELECT COUNT(*) FROM INSERTED
WHERE salary > 100000) > 0
BEGIN
print 'TRIG1 Error: you attempted to insert a salary > $100,000'
ROLLBACK TRANSACTION
END ;
GO
-- Try an insert that violates the trigger.
INSERT INTO dbo.trig_example VA LUES (1,'Pat Smith',100001) ;
GO
-- Disable the trigger.
ALTER TABLE dbo.trig_example DISABLE TRIGGER trig1 ;
GO
-- Try an insert that would typically violate the trigger.
INSERT INTO dbo.trig_example VALUES (2,'Chuck Jones',100001) ;
GO
-- Re-enable the trigger.
ALTER TABLE dbo.trig_example ENABLE TRIGGER trig1 ;
GO
-- Try an insert that violates the trigger.
INSERT INTO dbo.trig_example VALUES (3,'Mary Booth',100001) ;
GO
M. Creazione di un vincolo PRIMARY KEY con opzioni per gli indici
Nell'esempio seguente viene creato il vincolo PRIMARY KEY
PK_TransactionHistoryArchive_TransactionID e vengono impostate le opzioni FILLFACTOR,
ONLINE e PAD_INDEX. All'indice cluster risultante sarà assegnato lo stesso nome del
vincolo.
SQL
Copia
USE AdventureWorks2008R2;
GO
ALTER TABLE Production.TransactionHistoryArchive WITH NOCHECK
ADD CONSTRAINT PK_TransactionHistoryArchive_TransactionID PRIMARY KEY CLUSTERED (Tran
sactionID)
WITH (FILLFACTOR = 75, ONLINE = ON, PAD_INDEX = ON);
GO
N. Eliminazione di un vincolo PRIMARY KEY nella modalità ONLINE
Nell'esempio seguente viene eliminato un vincolo PRIMARY KEY con l'opzione ONLINE
impostata su ON.
SQL
Copia
USE AdventureWorks2008R2;
GO
ALTER TABLE Production.TransactionHistoryArchive
DROP CONSTRAINT PK_TransactionHistoryArchive_TransactionID
WITH (ONLINE = ON);
GO
O. Aggiunta e rimozione di un vincolo FOREIGN KEY
Nell'esempio seguente viene creata la tabella ContactBackup, successivamente modificata
con l'aggiunta di un vincolo FOREIGN KEY che fa riferimento alla tabella Person. Il vincolo
FOREIGN KEY viene quindi rimosso.
SQL
Copia
USE AdventureWorks2008R2 ;
GO
CREATE TABLE Person.ContactBackup
(ContactID int) ;
GO
ALTER TABLE Person.ContactBackup
ADD CONSTRAINT FK_ContactBacup_Contact FOREIGN KEY (ContactID)
REFERENCES Person.Person (BusinessEntityID) ;
ALTER TABLE Person.ContactBackup
DROP CONSTRAINT FK_ContactBacup_Contact ;
GO
DROP TABLE Person.ContactBackup ;
P. Modifica delle dimensioni di una colonna
Nell'esempio seguente vengono aumentate le dimensioni di una colonna varchar e la
precisione e la scala di una colonna decimal. Poiché le colonne contengono dati, le relative
dimensioni possono solo essere aumentate. Si noti inoltre che col_a è definito in un indice
univoco. Le dimensioni di col_a possono ancora essere aumentate poiché il tipo di dati è
varchar e l'indice non è il risultato di un vincolo PRIMARY KEY.
other
Copia
IF OBJECT_ID ( 'dbo.doc_exy', 'U' ) IS NOT NULL
DROP TABLE dbo.doc_exy;
GO
-- Create a two-column table with a unique index on the varchar column.
CREATE TABLE dbo.doc_exy ( col_a varchar(5) UNIQUE NOT NULL, col_b decimal (4,2));
GO
INSERT INTO dbo.doc_exy VALUES ('Test', 99.99);
GO
-- Verify the current column size.
SELECT name, TYPE_NAME(system_type_id), max_length, precision, scale
FROM sys.columns WHERE object_id = OBJECT_ID(N'dbo.doc_exy');
GO
-- Increase the size of the varchar column.
ALTER TABLE dbo.doc_exy ALTER COLUMN col_a varchar(25);
GO
-- Increase the scale and precision of the decimal column.
ALTER TABLE dbo.doc_exy ALTER COLUMN col_b decimal (10,4);
GO
-- Insert a new row.
INSERT INTO dbo.doc_exy VALUES ('MyNewColumnSize', 99999.9999) ;
GO
-- Verify the current column size.
SELECT name, TYPE_NAME(system_type_id), max_length, precision, scale
FROM sys.columns WHERE object_id = OBJECT_ID(N'dbo.doc_exy');
Q. Consentire l'escalation blocchi nelle tabelle partizionate
Nell'esempio seguente viene abilitata l'escalation blocchi a livello di partizione in una tabella
partizionata. Se la tabella non è partizionata, l'escalation blocchi verrà abilitata a livello
TABLE.
other
Copia
ALTER TABLE T1 SET (LOCK_ESCALATION = AUTO);
GO
R. Configurazione del rilevamento delle modifiche in una tabella
Nell'esempio seguente viene abilitato il rilevamento delle modifiche per la tabella
Person.Person nel database AdventureWorks2008R2.
Transact-SQL
Copia
USE AdventureWorks2008R2;
ALTER TABLE Person.Person
ENABLE CHANGE_TRACKING;
Nell'esempio seguente viene abilitato il rilevamento delle modifiche e il rilevamento delle
colonne aggiornate durante una modifica.
Transact-SQL
Copia
USE AdventureWorks2008R2;
ALTER TABLE Person.Person
ENABLE CHANGE_TRACKING
WITH (TRACK_COLUMNS_UPDATED = ON);
Nell'esempio seguente viene disabilitato il rilevamento delle modifiche per la tabella
Person.Person nel database AdventureWorks2008R2:
Transact-SQL
Copia
USE AdventureWorks2008R2;
ALTER TABLE Person.Person
DISABLE CHANGE_TRACKING;
S. Modifica di una tabella per cambiare la compressione
Nell'esempio seguente viene modificata la compressione di una tabella partizionata. L'heap
o l'indice cluster verrà ricompilato. Se la tabella è un heap, tutti gli indici non cluster
verranno ricompilati.
other
Copia
ALTER TABLE T1
REBUILD WITH (DATA_COMPRESSION = PAGE);
Nell'esempio seguente viene modificata la compressione di una tabella partizionata. La
sintassi REBUILD PARTITION = 1 consente di ricompilare solo il numero di partizione 1.
other
Copia
ALTER TABLE PartitionTable1
REBUILD PARTITION = 1 WITH (DATA_COMPRESSION =
GO
NONE) ;
Se per la stessa operazione viene utilizzata la sintassi alternativa seguente, vengono
ricompilate tutte le partizioni della tabella.
other
Copia
ALTER TABLE PartitionTable1
REBUILD PARTITION = ALL
WITH (DATA_COMPRESSION = PAGE ON PARTITIONS(1) ) ;
Per ulteriori esempi sulla compressione dei dati, vedere Creazione di tabelle e di indici
compressi2 5 .
T. Aggiunta di una colonna di tipo sparse
Negli esempi seguenti vengono illustrate l'aggiunta e la modifica di colonne di tipo sparse
nella tabella T1. Il codice per creare la tabella T1 è il seguente:
other
Copia
CREATE TABLE T1
(C1 int PRIMARY KEY,
C2 varchar(50) SPARSE NULL,
C3 int SPARSE NULL,
C4 int ) ;
GO
Per aggiungere una colonna di tipo sparse aggiuntiva C5, eseguire l'istruzione riportata di
seguito.
other
Copia
ALTER TABLE T1
ADD C5 char(100) SPARSE NULL ;
GO
Per convertire la colonna non di tipo sparse C4 in una colonna di tipo sparse, eseguire
l'istruzione riportata di seguito.
other
Copia
ALTER TABLE T1
ALTER COLUMN C4 ADD SPARSE ;
GO
Per convertire la colonna di tipo sparse C4 in una colonna non di tipo sparse, eseguire
l'istruzione riportata di seguito.
other
Copia
ALTER TABLE T1
ALTER COLUMN C4 DROP SPARSE;
GO
U. Aggiunta di un set di colonne
Negli esempi seguenti viene illustrato come aggiungere una colonna alla tabella T2. Un set
di colonne non può essere aggiunto a una tabella che contiene già colonne di tipo sparse. Il
codice per creare la tabella T2 è il seguente:
other
Copia
CREATE TABLE T2
(C1 int PRIMARY KEY,
C2 varchar(50) NULL,
C3 int NULL,
C4 int ) ;
GO
Le tre istruzioni seguenti aggiungono un set di colonne denominato CS, quindi modificano le
colonne C2 e C3 in SPARSE.
other
Copia
ALTER TABLE T2
ADD CS XML COLUMN_SET FOR ALL_SPARSE_COLUMNS ;
GO
ALTER TABLE T2
ALTER COLUMN C2 ADD SPARSE ;
GO
ALTER TABLE T2
ALTER COLUMN C3 ADD SPARSE ;
GO
V. Modifica delle regole di confronto di una colonna
Nell'esempio seguente viene illustrato come modificare le regole di confronto di una
colonna. Viene innanzitutto creata la tabella T3 con regole di confronto dell'utente
predefinite:
other
Copia
CREATE TABLE T3
(C1 int PRIMARY KEY,
C2 varchar(50) NULL,
C3 int NULL,
C4 int ) ;
GO
In seguito le regole di confronto della colonna C2 vengono impostate su
Latin1_General_BIN. Notare che il tipo di dati è richiesto, anche se non è modificato.
other
Copia
ALTER TABLE T3
ALTER COLUMN C2 varchar(50) COLLATE Latin1_General_BIN
GO