Differenze di funzionamento delle funzionalità del Motore di database in SQL Server 2005
Data aggiornamento: 17 luglio 2006
In questo argomento vengono descritte le differenze di funzionamento di alcune funzionalità di Motore di database in Microsoft SQL Server 2005 e nelle versioni precedenti di SQL Server.
Backup e recupero
Quando si ripristina un database esistente, SQL Server 2005 richiede di eseguire il backup della parte finale del log prima di ripristinare il database utilizzando il modello di recupero con registrazione completa o con registrazione minima delle transazioni di massa. Se si tenta di eseguire il ripristino di un database prima di eseguire il backup della parte finale del log verrà generato un errore, a meno che l'istruzione RESTORE non includa la clausola WITH REPLACE o WITH STOPAT. Per ulteriori informazioni, vedere Backup della parte finale del log.
Cursori
Nella tabella seguente vengono descritte le conversioni implicite del cursore che vengono generate in SQL Server 2000 ma non in SQL Server 2005. La soluzione consiste nel richiedere il tipo specifico di cursore anziché utilizzare la conversione implicita.
Condizione | In SQL Server 2000 il cursore viene convertito da | A |
---|---|---|
La query contiene una funzione inline valutata a livello di tabella. |
Dinamico/keyset |
Statico |
La query fa riferimento a un oggetto remoto. |
Fast-forward |
Keyset |
La query non contiene tabelle. |
Fast-forward |
Statico |
La query contiene una funzione per tabelle. |
Fast-forward |
Statico |
La query contiene una tabella derivata. |
Fast-forward |
Statico |
La query contiene una funzione valutata a livello di tabella con istruzioni multiple. |
Dinamico Keyset |
Da keyset a statico Statico |
La query contiene una tabella virtuale. |
Dinamico/keyset |
Statico |
La query contiene una vista con clausola TOP. |
Fast-forward |
Statico |
La query contiene viste partizionate aggiornabili. |
Fast-forward |
Statico |
La query del cursore API contiene una vista indicizzata con un percorso di accesso univoco, ma non a livello della tabella di base. |
Keyset |
Statico |
La query del cursore API contiene una tabella senza indice cluster o chiave univoca. |
Keyset |
Statico |
Il set di risultati del cursore API contiene una colonna text, ntext o image. |
Fast-forward |
Dinamico |
SQL Server 2005 non supporta la generazione asincrona di cursori Transact-SQL gestiti da keyset o statici. Le operazioni sui cursori di Transact-SQL, ad esempio OPEN o FETCH, sono generalmente di tipo batch, quindi la generazione asincrona di cursori Transact-SQL non è necessaria. I cursori API del server gestiti da keyset o statici in cui il parametro OPEN a bassa latenza rappresenta un problema per via dei round trip del client per ogni operazione sul cursore sono ancora supportati in SQL Server 2005.
Quando viene dichiarato un cursore dinamico per una tabella priva di indici univoci e viene eliminata una riga al di fuori del cursore in SQL Server 2005, un aggiornamento successivo del cursore recupera un segnaposto per la riga con dati NULL. Nelle versioni precedenti di SQL Server il cursore non restituisce la riga interessata.
Se in SQL Server 2005 sono possibili dichiarazioni diverse del cursore tramite la logica condizionale all'interno di un batch o di una stored procedure, le istruzioni INSERT, UPDATE e DELETE eseguite tramite il cursore generano una ricompilazione, mentre in SQL Server 2000 queste istruzioni non generano una ricompilazione.
Nell'esempio seguente l'istruzione UPDATE
genererà una ricompilazione del modulo.
IF(@some_condition=1)
DECLARE c CURSOR FOR
SELECT region FROM db.dbo.mytable ORDER BY lastname
ELSE
DECLARE c CURSOR FOR
SELECT postalcode FROM db.dbo.mytable ORDER BY firstname
...
FETCH NEXT FROM c
...
UPDATE db.dbo.mytable
SET firstname='a' WHERE CURRENT OF c
Per evitare la ricompilazione riscrivere il codice nel modo seguente:
IF (@some_condition=1)
BEGIN
DECLARE c CURSOR FOR
SELECT region FROM db.dbo.mytable ORDER BY lastname
FETCH NEXT FROM c
UPDATE db.dbo.mytable
SET firstname='a' WHERE CURRENT OF c
END
ELSE
BEGIN
DECLARE c CURSOR FOR
SELECT postalcode FROM db.dbo.mytable ORDER BY firstname
FETCH NEXT FROM c
UPDATE db.dbo.mytable
SET firstname='a' WHERE CURRENT OF c
END
In SQL Server 2005 i blocchi di scorrimento acquisiscono un aggiornamento di blocco da S (Shared) a U (Update), a meno che non venga specificato un hint di blocco più alto nella query. SQL Server 2000 aggiunge in modo trasparente un hint di blocco U per i blocchi di scorrimento. Il funzionamento di SQL Server 2005 consente una migliore concorrenza, ma crea la possibilità di deadlock (messaggio 1205) per cursori simultanei. Utilizzare l'hint UPDLOCK per ottenere il funzionamento desiderato. Per ulteriori informazioni, vedere table_hint (Transact-SQL).
Quando un valore di colonna o di riga che appare più di una volta in un buffer di recupero di cursore viene aggiornato in SQL Server 2000, le altre occorrenze potrebbero non riflettere l'aggiornamento per via delle dimensioni del buffer di recupero o della posizione delle righe nel buffer. In SQL Server 2005 le righe nel buffer di recupero vengono aggiornate in modo che i valori siano sempre coerenti, indipendentemente dalle dimensioni del buffer di recupero o dalla posizione delle righe.
In SQL Server 2000 i cursori che riguardano un'istruzione UNION ALL restituiscono in modo errato informazioni sulla possibilità di aggiornamento basate sul primo set di UNION. Di conseguenza alcuni cursori vengono notificati come aggiornabili anche quando non lo sono. SQL Server 2005 notifica i risultati di UNION ALL come calcolati e, quindi, non aggiornabili. Se tutte le righe di cursore provengono da un'unica tabella o vista è possibile definire un cursore aggiornabile modificando la query in modo da utilizzare clausole IN o OR, anziché clausole UNION.
In SQL Server 2000, quando l'opzione CURSOR_CLOSE_ON_COMMIT è impostata su ON, tutti i cursori di una connessione vengono chiusi al commit della transazione. In SQL Server 2005 solo i cursori aperti nella transazione corrente vengono chiusi durante il commit della transazione. I cursori aperti prima dell'inizio della transazione restano aperti.
SQL Server 2000 consente l'utilizzo di alcune dichiarazioni di cursore non valide e le converte in altri tipi di cursori. SQL Server 2005 non consente dichiarazioni non valide. Un cursorse che richiede sia aggiornabilità che insensibilità, ad esempio, non è valido in SQL Server 2005 e genera un errore.
Database, file di dati e di log
Funzionamento di SQL Server 2000 | Funzionamento di SQL Server 2005 |
---|---|
L'opzione di database AUTO_CLOSE è un processo sincrono in grado di ridurre le prestazioni durante l'accesso al database da parte di un'applicazione che apre e interrompe ripetutamente connessioni a Motore di database. |
Il processo AUTO_CLOSE è asincrono. L'apertura e la chiusura ripetute del database non riducono più le prestazioni. |
I file nelle partizioni non formattate dal sistema operativo non sono soggetti all'aumento automatico delle dimensioni e quindi i parametri MAXSIZE e FILEGROWTH non sono necessari quando os_file_name specifica una partizione non formattata dal sistema operativo. |
I file su partizioni non formattate dal sistema operativo sono soggetti all'aumento automatico delle dimensioni. È possibile specificare i parametri MAXSIZE e FILEGROWTH. |
Le autorizzazioni non vengono impostate per i file di dati e di log in ogni database. |
Le autorizzazioni vengono impostate per i file di dati e di log ogni volta che le operazioni seguenti vengono eseguite sul database:
CreazioneModifica per l'aggiunta di un nuovo file
CollegamentoEsecuzione del backup
ScollegamentoRipristino
|
Le autorizzazioni consentono di evitare che vengano accidentalmente alterati i file che si trovano in una directory con autorizzazioni aperte. Per ulteriori informazioni, vedere Protezione dei dati e dei file di log.
Nota:
In Microsoft SQL Server 2005 Express Edition non vengono impostate autorizzazioni per i file di dati e di log.
Server collegati e query distribuite
Un server collegato definito utilizzando 'SQLOLEDB' come nome provider verrà modificato in 'SQLNCLI' (SQL Native Client OLE DB Provider) al momento dell'aggiornamento. Nella vista di compatibilità sys.sysservers vengono visualizzati i server collegati che utilizzano 'SQLNCLI' come 'SQLOLEDB'. La vista del catalogo sys.servers di SQL Server 2005visualizza i server collegati che utilizzano 'SQLNCLI' come 'SQLNCLI'.
Le query eterogenee e l'utilizzo di provider OLE DB non sono supportati quando SQL Server viene eseguito in modalità fiber. Quando l'opzione di configurazione avanzata lightweight pooling è impostata su 1 la modalità fiber è attivata.
Non è possibile creare un'istanza out-of-process del provider OLE DB per SQL Native Client.
I messaggi di avviso di un server collegato in SQL Server 2005 non vengono propagati al client. Le classi più significative di tali avvisi sono le seguenti:
- Avvisi compatibili con ANSI per segnalare l'eliminazione di valori NULL in un calcolo aggregato
- Avvisi di overflow aritmetico
L'istruzione Transact-SQL seguente, ad esempio, potrebbe generare un messaggio di avviso se col1
contiene valori NULL:
SELECT SUM(col1)
FROM <Table>
GROUP BY col2
In SQL Server 2000 e versioni precedenti i server collegati propagano il messaggio di avviso al client, mentre in SQL Server 2005 i server collegati non propagano alcun messaggio di avviso al client.
In SQL Server 2000, quando una stored procedure remota non viene eseguita correttamente a causa di errori in fase di compilazione, ad esempio un'associazione di parametro errata, il valore/stato restituito è impostato su 0. Quando tale scenario si verifica in SQL Server 2005, il valore/stato restituito è impostato su NULL.
Architettura di Query Processor
L'utilizzo dei valori dei parametri durante la ricompilazione è diversa in SQL Server 2000 e in SQL Server 2005 per i batch inoltrati nelle forme seguenti:
- Stored procedure
- Utilizzo di sp_executesql
- Istruzioni preparate
Quando SQL Server 2000 ricompila tali batch, utilizza i valori dei parametri con i quali i batch vengono chiamati come parte della ricompilazione. Quando SQL Server 2005 ricompila tali query, utilizza i valori dei parametri presenti subito prima dell'istruzione che genera la ricompilazione. Tali valori possono differire da quelli passati in origine al batch. Per ulteriori informazioni, vedere Parametri e riutilizzo del piano di esecuzione.
Protezione
Funzionalità | Funzionamento di SQL Server 2000 | Funzionamento di SQL Server 2005 |
---|---|---|
GRANT ALL |
Concede tutte le autorizzazioni applicabili. |
La concessione dell'autorizzazione ALL sugli oggetti e le istruzioni è obsoleta. Quando viene eseguito il comando GRANT ALL si verificano le situazioni seguenti:
In SQL Server 2005 sono disponibili ulteriori autorizzazioni in vari ambiti che possono essere utilizzate per gestire le autorizzazioni utente. Ad esempio, l'autorizzazione CONTROL può essere utilizzata per concedere autorizzazioni di proprietà su un oggetto. |
Differenze nell'utilizzo delle password |
In SQL Server 2000 vengono mantenute due versioni di ogni password di accesso di SQL Server. Una corrisponde alla password effettiva specificata dall'utente e l'altra alla password i cui caratteri sono stati tutti convertiti in maiuscolo da SQL Server. In questo modo non viene tenuto conto della distinzione tra maiuscole e minuscole per la convalida delle password. Questa situazione può risultare utile per molti utenti, tuttavia può agevolare l'individuazione della password da parte di utenti malintenzionati in quanto implica una riduzione del numero di password possibili. |
Viene archiviata solo la password effettiva, pertanto la password immessa dall'utente deve corrispondere a quella archiviata nel server. Se una password non corrisponde a quella archiviata in SQL Server, l'accesso non verrà eseguito. Se viene dimenticata la sequenza esatta di maiuscole e minuscole nei caratteri, sarà necessario reimpostare la password. |
Modifica della lingua predefinita per l'account sa |
La lingua predefinita per l'account sa di SQL Server è la lingua che viene selezionata durante l'installazione o l'aggiornamento. Nelle versioni precedenti di Microsoft SQL Server, l'esecuzione di sp_configure per modificare la lingua predefinita del server consente anche di aggiornare la lingua predefinita per l'account sa. |
Per modificare la lingua predefinita per l'account sa in SQL Server 2005, è necessario eseguire la stored procedure sp_defaultlanguage, eseguire il comando DBCC FREESYSTEMCACHE e quindi avviare una nuova sessione. Se si esegue sp_configure per modificare la lingua predefinita per il server non viene aggiornata la lingua predefinita per l'account sa. |
Stored procedure di sistema
Nella tabella seguente vengono descritte le modifiche apportate ai parametri nelle stored procedure di sistema di Motore di database.
Stored procedure | Parametro | Descrizione della modifica |
---|---|---|
sp_bindefault |
@objname |
Le dimensioni sono state modificate da nvarchar(517) a nvarchar(776). |
sp_bindrule |
@objname |
Le dimensioni sono state modificate da nvarchar(517) a nvarchar(776). |
sp_changeobjectowner |
@objname |
Le dimensioni sono state modificate da nvarchar(517) a nvarchar(776). |
sp_detach_db |
@keepfulltextindexfile |
Le dimensioni sono state modificate da nvarchar(517) a nvarchar(776). |
sp_fulltext_service |
@action |
Le dimensioni sono state modificate da varchar(20) a nvarchar(100). |
sp_fulltext_service |
@value |
Il tipo di dati è stato modificato da int a sql_variant. |
sp_getapplock |
@DbPrincipal |
Parametro aggiunto. |
sp_releaseapplock |
@DbPrincipal |
Parametro aggiunto. |
sp_setapprole |
@fCreateCookie |
Parametro aggiunto. |
sp_setapprole |
@cookie |
Parametro aggiunto. |
sp_settriggerorder |
@stmttype |
Le dimensioni sono state modificate da varchar(10) a varchar(50). |
sp_settriggerorder |
@namespace |
Parametro aggiunto. |
sp_sproc_columns |
@fUsePattern |
Parametro aggiunto. |
sp_stored_procedures |
@fUsePattern |
Parametro aggiunto. |
sp_table_privileges |
@fUsePattern |
Parametro aggiunto. |
sp_table_privileges_ex |
@fUsePattern |
Parametro aggiunto. |
sp_tables |
@fUsePattern |
Parametro aggiunto. |
sp_tables_ex |
@fUsePattern |
Parametro aggiunto. |
Tabelle e viste di sistema
Nella tabella seguente sono elencate le modifiche apportate alle tabelle e alle viste di sistema.
Tabella o vista di sistema | Colonna | Descrizione della modifica |
---|---|---|
COLUMNS |
ORDINAL_POSITION |
Il tipo di dati è stato modificato da smallint a int. |
PARAMETERS |
ORDINAL_POSITION |
Il tipo di dati è stato modificato da smallint a int. |
REFERENTIAL_CONSTRAINTS |
MATCH_OPTION |
Le dimensioni sono state modificate da varchar(4) a varchar(7). Valore predefinito modificato da 'NONE' in 'SIMPLE'. |
REFERENTIAL_CONSTRAINTS |
UPDATE_RULE |
Le dimensioni sono state modificate da varchar(9) a varchar(11). |
REFERENTIAL_CONSTRAINTS |
DELETE_RULE |
Le dimensioni sono state modificate da varchar(9) a varchar(11). |
ROUTINE_COLUMNS |
ORDINAL_POSITION |
Il tipo di dati è stato modificato da smallint a int. |
sysaltfiles |
name |
Il tipo di dati è stato modificato da nchar(128) a sysname. |
sysaltfiles |
filename |
Il tipo di dati è stato modificato da nchar(260) a nvarchar(260). |
sysconfigures |
config |
Il tipo di dati è stato modificato da smallint a int. |
syscursorcolumns |
data_type_sql |
Il tipo di dati è stato modificato da smallint a int. |
sysfiles |
name |
Il tipo di dati è stato modificato da nchar(128) a sysname. |
sysfiles |
filename |
Il tipo di dati è stato modificato da nchar(260) a nvarchar(260). |
sysmessages |
severity |
Il tipo di dati è stato modificato da smallint a tinyint. |
sysperfinfo |
cntr_value |
Il tipo di dati è stato modificato da int a bigint. |
sysprocesses |
waittime |
Il tipo di dati è stato modificato da int a bigint. |
sysprocesses |
hostprocess |
Le dimensioni sono state modificate da nchar(8) a nchar(10). |
sysprocesses |
request_id |
Colonna aggiunta. |
sysprotects |
columns |
Le dimensioni sono state modificate da varbinary(4000) a varbinary(8000). |
sysservers |
srvcollation |
Il tipo di dati è stato modificato da int a sysname. |
sysservers |
nonsqlsub |
Colonna aggiunta. |
sysoledbusers |
rmtpassword |
Restituisce solo NULL. |
sysindexes |
keys |
Restituisce solo NULL. |
sysindexes |
statblob |
Restituisce solo NULL. |
syscomments |
compressed |
Restituisce solo 0. |
sysdevices |
size |
Restituisce solo 0. |
sysobjects |
schema_ver |
Restituisce solo 0. |
sysremotelogins |
status |
Restituisce solo 0. |
sysservers |
topologyx |
Restituisce solo 0. |
sysservers |
topologyy |
Restituisce solo 0. |
Transact-SQL
Funzionalità | Funzionamento di SQL Server 2000 | Funzionamento di SQL Server 2005 |
---|---|---|
Utilità bcp |
Un utente che dispone di autorizzazioni INSERT e SELECT su una tabella può utilizzare l'utilità bcp per eseguire un caricamento di massa dei dati nella tabella utilizzando il comando seguente:
Per impostazione predefinita, questo comando disattiva i vincoli e i trigger CHECK sulle tabelle di destinazione. |
Per eseguire l'utilità bcp, l'utente deve disporre dell'autorizzazione ALTER e delle autorizzazioni INSERT e SELECT sulle tabelle di destinazione se i vincoli e i trigger CHECK vengono disattivati durante il processo di copia di massa. Dopo l'aggiornamento a SQL Server 2005, i comandi bcp nelle applicazioni possono non riuscire perché le autorizzazioni di cui si dispone sono insufficienti. È possibile risolvere questo problema in uno dei modi seguenti:
|
Funzioni di sistema predefinite |
Ogni riferimento alle funzioni predefinite, ad esempio NEWID e RAND, produce un risultato diverso perché la funzione viene valutata una volta per ogni riferimento a query esterne. |
Una query esterna può fare più riferimenti a colonne di viste o tabelle derivate. Se tuttavia tali colonne sono definite tramite la chiamata di funzioni quali NEWID e RAND, in presenza di più riferimenti la funzione verrà valutata una sola volta per ciascuna chiamata effettiva all'interno della vista o della tabella derivata. In presenza di più riferimenti a tali colonne in una subquery le funzioni non verranno comunque valutate più volte. È quindi possibile riutilizzare il valore prodotto da queste funzioni nella subquery. Ad esempio, in SQL Server 2000 la query seguente restituisce due valori diversi, mentre in SQL Server 2005 ne restituisce uno solo.
|
BULK INSERT |
BULK INSERT supporta la conversione del tipo da stringa a decimale per le stringhe che rappresentano valori numerici che utilizzano la notazione scientifica. |
Le conversioni del tipo da stringa a decimale utilizzate in BULK INSERT seguono le stesse regole della funzione Transact-SQL CONVERT. Questa funzione rifiuta le stringhe che rappresentano valori numerici che utilizzano la notazione scientifica. BULK INSERT tratta quindi tali stringhe come valori non validi e notifica errori di conversione. Per ulteriori informazioni, vedere BULK INSERT (Transact-SQL). |
Conversioni datetime |
Le conversioni da stringa a datetime sono contrassegnate come deterministiche. Fanno eccezione gli stili descritti nella tabella seguente, per i quali le conversioni dipendono dalle impostazioni di lingua. Nella tabella seguente vengono descritti gli stili per i quali la conversione da stringa a datetime è non deterministica.
Tutti gli stili inferiori a 1001106
107109
113130
|
1 Ad eccezione degli stili 20 e 21
SQL Server 2005 contrassegna le conversioni da stringa a datetime come non deterministiche.
DBCC CHECKFILEGROUP
Se un indice non cluster nel filegroup specificato è associato a una tabella in un altro filegroup, vengono controllati l'indice e la tabella di base dell'altro filegroup.
Se un indice non cluster nel filegroup specificato è associato a una tabella in un altro filegroup, l'indice non viene verificato poiché la tabella di base non è disponibile per la convalida.
DBCC SHOW_STATISTICS
Il set di righe restituito da DBCC SHOW_STATISTICS non contiene una colonna Name.
Il primo set di righe restituito da DBCC SHOW_STATISTICS contiene una colonna aggiuntiva il cui titolo è Name. Tale colonna viene visualizzata come prima colonna del set di risultati. Se sono presenti applicazioni che accedono alle colonne restituite da DBCC SHOW_STATISTICS in base alla posizione ordinale, modificarle in modo che accedano alla colonna in base al nome.
DROP LOGIN
Quando si esegue DROP LOGIN, l'account di accesso non viene eliminato se gli utenti del database sono mappati a esso.
Quando si esegue DROP LOGIN, l'account di accesso viene eliminato anche se gli utenti del database sono mappati a esso.
Espressioni in colonne calcolate, vincoli CHECK e vincoli DEFAULT
Il testo originale di un'espressione, inclusi gli spazi vuoti, viene mantenuto nei metadati del catalogo. Ad esempio, un'espressione di colonna calcolata immessa come c1 + c2 + 1
verrà visualizzata esattamente come immessa nella colonna text della tabella di sistema syscomments.
Il testo originale di un'espressione viene decodificato e normalizzato, mentre l'output di questa operazione viene archiviato nei metadati del catalogo. La semantica dell'espressione decodificata sarà equivalente al testo originale, tuttavia non è garantito che la sintassi venga mantenuta. Ad esempio, un'espressione di colonna calcolata immessa come c1 + c2 + 1
verrà visualizzata come (([c1]+[c2])+(1))
nella colonna delle definizioni nella visualizzazione del catalogo di sistema sys.computed_columns.
Espressioni nelle query
Le espressioni non sicure nelle query non generano sempre un'eccezione di run-time.
A volte in SQL Server 2005 le espressioni incluse nelle query vengono valutate molto prima rispetto a SQL Server 2000. Tale funzionamento offre i vantaggi seguenti:
- Consente di mettere in corrispondenza indici su colonne calcolate con espressioni di una query che corrispondono all'espressione delle colonne calcolate.
- Consente di prevenire il calcolo ridondante dei risultati delle espressioni.
A seconda della natura della query e dei dati inclusi nel database, possono tuttavia verificarsi eccezioni di run-time in SQL Server 2005 se la query contiene un'espressione esistente non sicura, ad esempio:
- Eccezioni aritmetiche, ad esempio divisione per zero, overflow e underflow.
- Errori di conversione, ad esempio perdita di precisione e un tentativo di convertire una stringa non numerica in un numero.
- Aggregazione su un set di valori che potrebbero non essere tutti non Null.
Queste eccezioni potrebbero invece non verificarsi in SQL Server 2000 in un'applicazione specifica con dati specifici. La presenza di un piano di query modificato in seguito alla variazione delle statistiche potrebbe tuttavia generare un'eccezione in SQL Server 2000. Per prevenire queste eccezioni di run-time, modificare la query in modo da includere espressioni condizionali quali NULLIF o CASE. Per ulteriori informazioni, vedere Risoluzione dei problemi relativi agli errori e agli avvisi nelle espressioni di query.
fn_servershareddrives
I dati restituiti dalla funzione di sistema fn_servershareddrives possono essere visualizzati dai membri del ruolo public.
Modifica di autorizzazione: fn_servershareddrives richiede all'utente di disporre dell'autorizzazione VIEW SERVER STATE sul server.
Importante:
Questa funzione di sistema di SQL Server 2000 è disponibile per compatibilità con le versioni precedenti. È consigliabile utilizzare invece sys.dm_io_cluster_shared_drives.
fn_virtualfilestats
I dati restituiti dalla funzione di sistema fn_virtualfilestats possono essere visualizzati dai membri del ruolo public.
Modifica di autorizzazione: fn_virtualfilestats richiede all'utente di disporre dell'autorizzazione VIEW SERVER STATE sul server.
fn_virtualservernodes
I dati restituiti dalla funzione di sistema fn_virtualservernodes possono essere visualizzati dai membri del ruolo public.
Modifica di autorizzazione: fn_virtualservernodes richiede all'utente di disporre dell'autorizzazione VIEW SERVER STATE sul server.
Importante:
Questa funzione di sistema SQL Server 2000 è disponibile per compatibilità con le versioni precedenti. È consigliabile utilizzare invece sys.dm_os_cluster_nodes.
HOST_ID
HOST_ID restituisce un valore char(8).
HOST_ID restituisce un valore char(10).
Indici
Sono consentiti gli indici descritti nella colonna "Funzionamento di SQL Server 2005".
Gli indici seguenti possono essere disattivati durante il processo di aggiornamento o necessitare di ricostruzione a causa delle modifiche introdotte a SQL Server 2005:
- Gli indici sulle colonne calcolate che utilizzano CHECKSUM(some_timestamp_column) saranno disattivati perché il funzionamento della funzione Transact-SQL CHECKSUM è stato modificato quando accetta una colonna timestamp come argomento.
- Gli indici contenenti i valori di tipo carattere 0x3390, 0x33ca o 0x33cb in colonne nvarchar o nchar che utilizzano regole di confronto basate sul turco possono necessitare di ricostruzione per via delle modifiche apportate al tipo di ordinamento di tali regole di confronto.
- Gli indici nelle colonne calcolate o nelle viste nelle quali l'espressione di vista o di colonna calcolata contiene una conversione implicita da stringa a datetime o smalldatetime oppure una conversione esplicita non deterministica da stringa a datetime o smalldatetime saranno disattivati.
Eseguire la procedura seguente per gli indici che necessitano di ricostruzione a causa delle modifiche descritte nei due punti precedenti.
Cercare nel log degli errori di SQL Server il messaggio di avviso 3801, 3803 o 3804.
Eseguire DBCC CHECKTABLE nella tabella sottostante per verificare l'esistenza di un problema.
Se i risultati dell'istruzione DBCC indicano la presenza di un problema, ricreare l'indice utilizzando uno dei metodi seguenti:
- Istruzione ALTER INDEX con clausola REBUILD
- Istruzione CREATE INDEX con clausola DROP_EXISTING
- Istruzione DBCC DBREINDEX
Identificare i vincoli FOREIGN KEY utilizzando l'istruzione seguente:
SELECT * FROM sys.foreign_keys WHERE is_disabled=1;
Attivare gli eventuali vincoli FOREIGN KEY utilizzando l'istruzione ALTER TABLE CHECK CONSTRAINT.
Per attivare i vincoli PRIMARY KEY e UNIQUE, è necessario ricostruire l'indice associato. L'indice deve essere ricreato prima di attivare i vincoli FOREIGN KEY che fanno riferimento al vincolo PRIMARY KEY o UNIQUE.
Eseguire la procedura seguente per gli indici disattivati a causa delle modifiche descritte nel terzo punto precedente.
Identificare gli indici sulle colonne calcolate disattivate utilizzando l'istruzione seguente:
SELECT object_name(i.object_id) AS object_name, i.* FROM sys.indexes AS i JOIN sys.index_columns AS ic ON i.index_id = ic.index_id AND i.object_id = ic.object_id JOIN sys.computed_columns AS cc ON ic.object_id = cc.object_id AND ic.column_id = cc.column_id WHERE i.is_disabled = 1
Per un indice di colonna calcolata, eliminare l'indice e quindi modificare la definizione di colonna calcolata in modo da utilizzare una funzione esplicita CONVERT con uno stile di data deterministico.
Per una vista indicizzata, eliminare la vista e quindi ridefinirla utilizzando una funzione esplicita CONVERT con uno stile di data deterministico.
Ricreare l'indice sulla colonna calcolata modificata o sulla vista modificata.
Indici
In SQL Server 2000 le operazioni di indice parallele sono supportate nelle versioni Developer, Standard ed Enterprise.
In SQL Server 2005 le operazioni parallele per la creazione, l'eliminazione o la ricostruzione di indici sono disponibili solo nelle edizioni Developer ed Enterprise.
In seguito all'aggiornamento da SQL Server 2000 Standard Edition a SQL Server 2005 Standard Edition, le operazioni per la creazione, l'eliminazione o la ricostruzione di indici vengono eseguite in modo seriale in SQL Server 2005 Standard Edition e possono richiedere molto più tempo.
Il problema non interessa le istruzioni SELECT, INSERT, UPDATE e DELETE, che verranno comunque eseguite in parallelo in SQL Server 2005 Standard Edition.
Dopo l'aggiornamento a SQL Server 2005 Standard Edition, controllare le operazioni per la creazione, l'eliminazione o la ricostruzione di indici. Potrebbe essere necessario modificare gli script di manutenzione o adeguare le attività di manutenzione pianificata in modo da assegnare più tempo a queste operazioni.
Per eseguire operazioni parallele sugli indici, installare SQL Server 2005 Enterprise Edition.
Clausola ORDER BY
I nomi di colonna nella clausola ORDER BY vengono risolti nelle colonne incluse nell'elenco di selezione indipendentemente dal fatto che siano completi.
Ad esempio, la query seguente viene eseguita senza errori:
USE pubs
SELECT au_fname AS 'FName',
au_lname AS 'LName'
FROM authors a
ORDER BY a.LName
SQL Server ignora il qualificatore a
nella clausola ORDER BY
e risolve il nome di colonna LName
nell'elenco di selezione.
I nomi completi e gli alias di colonna vengono risolti nelle colonne delle tabelle elencate nella clausola FROM. Se il valore specificato in order_by_expression non è completo, deve essere univoco tra tutte le colonne elencate nell'istruzione SELECT.
Ad esempio, la query equivalente seguente restituisce un errore:
USE AdventureWorks
SELECT FirstName AS 'FName',
LastName AS 'LName'
FROM Person.Contact p
ORDER BY p.LName
SQL Server non ignora il qualificatore p
nella clausola ORDER BY
e risolve il nome di colonna LName
nelle tabelle elencate nella clausola FROM
. Tuttavia la clausola FROM
non riconosce che la colonna LName
è un alias di colonna della tabella p
.
Funzione SERVERPROPERTY
Il tipo restituito della proprietà ProductVersion nella funzione SERVERPROPERTY è varchar.
Il tipo restituito della proprietà ProductVersion nella funzione SERVERPROPERTY è nvarchar.
sp_addtype
Qualsiasi utente può eseguire sp_addtype.
Gli utenti devono essere membri del ruolo del database db_ddladmin o db_owner per eseguire sp_addtype.
Per consentire agli utenti di creare tipi di dati alias deve essere apportata una delle modifiche seguenti:
- Per utilizzare sp_addtype aggiungere gli utenti al ruolo del database db_ddladmin o db_owner.
- Per creare un tipo di dati alias utilizzando CREATE TYPE concedere agli utenti l'autorizzazione CREATE TYPE e l'autorizzazione ALTER per gli utenti nello schema di destinazione.
sp_altermessage
sp_altermessage può essere utilizzato per specificare se un messaggio di sistema, ovvero con ID messaggio < 50000, deve essere scritto nel registro applicazioni di Windows.
sp_altermessage non può essere utilizzato per modificare il funzionamento della registrazione dei messaggi di sistema, ovvero con ID messaggio < 50000. Per controllare i messaggi di sistema utilizzare Traccia SQL e la classe di evento User Error Message. Per ulteriori informazioni, vedere Introduzione a Traccia SQL.
sp_changedbowner
sp_changeobjectowner può essere eseguito solo dai membri del ruolo predefinito del server sysadmin o del ruolo predefinito del database db_owner oppure da un membro di entrambi i ruoli predefiniti del database db_ddladmin e db_securityadmin .
Un utente in grado di eseguire questa stored procedure grazie all'appartenenza ai ruoli predefiniti del database db_ddladmin e db_securityadmin deve anche ricevere l'autorizzazione CONTROL sull'entità di protezione. L'esecuzione di sp_changeobjectowner senza l'autorizzazione CONTROL sull'oggetto di destinazione avrà esito negativo e genererà il messaggio di errore seguente:
"Msg 15247, Level 16, State 1, Procedure sp_changeobjectowner, Line 17
L'utente non dispone dell'autorizzazione per l'esecuzione di questa azione."
sp_help
sp_help restituisce un set di risultati per le funzioni.
sp_help restituisce due set di risultati per le funzioni. Il set di risultati aggiuntivo viene utilizzato per i parametri delle funzioni.
sysindexes
sys.sysindexes è disponibile per compatibilità con le versioni precedenti. Tuttavia le modifiche apportate a SQL Server 2005 impediscono la compatibilità completa con le versioni precedenti di SQL Server.
Metadati di sistema
I membri del ruolo public possono eseguire query sulle tabelle di sistema e visualizzare metadati del catalogo.
Gli utenti che eseguono query sul catalogo possono solo visualizzare righe di metadati per gli oggetti di loro proprietà o sui quali dispongono di autorizzazione o del privilegio di visualizzazione grazie all'appartenenza a un ruolo. Per ulteriori informazioni e operazioni consigliate, vedere Configurazione della visibilità dei metadati e Risoluzione dei problemi relativi alla visibilità dei metadati.
Tabelle di sistema
Le tabelle di sistema sono di tipo 'S'.
Le tabelle di sistema sono disponibili come viste di compatibilità e sono di tipo 'V'. Le istruzioni che eseguono query sulle tabelle di sistema e includono il tipo di criteri di ricerca = 'S' avranno esito negativo.
Modificare i criteri di ricerca delle istruzioni nel tipo = 'V'.
Oppure
Migrare alle nuove viste del catalogo o viste a gestione dinamica. Per ulteriori informazioni, vedere Mapping delle tabelle di sistema di SQL Server 2000 alle viste di sistema di SQL Server 2005.
TABLOCK quando si esegue l'importazione di massa utilizzando bcp, BULK INSERT o OPENROWSET(BULK...)
Per l'importazione di massa in una tabella con un indice cluster non vuoto, l'hint TABLOCK viene ignorato.
Per l'importazione di massa in una tabella con un indice cluster non vuoto, l'hint TABLOCK acquisisce un blocco X sulla tabella. Questo impedisce l'importazione di massa di dati in parallelo. Se si desidera eseguire un'importazione di massa in parallelo in questo caso, non utilizzare TABLOCK. Per ulteriori informazioni sul caricamento di massa in parallelo, vedere Linee guida per l'ottimizzazione dell'importazione di massa.
Trigger
La ricorsione diretta di trigger si verifica solo quando un trigger viene attivato ed esegue un'operazione che attiva nuovamente lo stesso trigger.
La ricorsione diretta dei trigger si verifica in una delle cirostanze seguenti:
- Un trigger viene attivato ed esegue un'azione che attiva nuovamente lo stesso trigger.
- Viene chiamato nuovamente lo stesso trigger, ma dopo la chiamata di un trigger di un altro tipo (AFTER o INSTEAD OF).
La ricorsione indiretta si verifica quando un trigger viene attivato ed esegue un'azione che attiva un altro trigger dello stesso tipo (AFTER o INSTEAD OF). Il secondo esegue un'operazione che attiva nuovamente il trigger originale.
Per ulteriori informazioni, vedere la sezione relativa ai trigger ricorsivi in Utilizzo di trigger nidificati.
Trigger
Quando si esegue un'istruzione UPDATE o DELETE su una vista partizionata, locale o distribuita, vengono attivati tutti i trigger UPDATE o DELETE definiti sulle tabelle di base della vista, inclusi i trigger sulle tabelle non interessate dall'operazione di aggiornamento o eliminazione.
Quando si esegue un'istruzione UPDATE o DELETE su una vista partizionata, il trigger UPDATE o DELETE viene eseguito solo se la tabella di base su cui è definito il trigger è coinvolta nell'operazione di aggiornamento o eliminazione. Per ulteriori informazioni, vedere Esecuzione di trigger DML.
Funzione UPDATE()
La funzione UPDATE() non rileva le modifiche alle colonne timestamp. Per questo tipo di colonne una clausola IF UPDATE() all'interno del corpo di un trigger restituisce FALSE indipendentemente dal fatto che le colonne siano state aggiornate.
La funzione UPDATE() rileva le modifiche alle colonne timestamp. Per questo tipo di colonne una clausola IF UPDATE() all'interno del corpo di un trigger DML restituisce TRUE indipendentemente dal fatto che le colonne siano state aggiornate.
Funzioni definite dall'utente
Le funzioni definite dall'utente non possono includere funzioni di sistema predefinite non deterministiche.
Le funzioni Transact-SQL definite dall'utente possono includere la maggior parte delle funzioni di sistema predefinite non deterministiche. Per un elenco completo delle funzioni predefinite consentite, vedere Creazione di funzioni definite dall'utente (Motore di database).
Tipi di dati varchar, nvarchar e varbinary
Una stringa o un valore binario di lunghezza zero utilizzato come definizione di una colonna di tabella calcolata crea una colonna di tipo varchar(0), nvarchar(0) o varbinary(0).
Una stringa o un valore binario di lunghezza zero utilizzato come definizione di una colonna di tabella calcolata crea una colonna di tipo varchar(1), nvarchar(1) o varbinary(1). Questa modifica di comportamento incide solo sul tipo di dati della colonna calcolata ma non sul valore calcolato.
Modificare le applicazioni che esaminano la lunghezza dei tipi di dati delle colonne calcolate in modo che sia prevista una lunghezza minima di 1 byte per le colonne varchar e varbinary e di 2 byte per le colonne nvarchar.
Accesso alle tabelle virtuali
Le tabelle virtuali sono accessibili agli utenti guest o ai membri del ruolo public.
Per accedere a una tabella virtuale, ad esempio sysprocesses, è necessario disporre delle autorizzazioni VIEW SERVER STATE e SELECT.
Clausola WITH CHECK OPTION sulle viste
Le operazioni di inserimento e aggiornamento sono consentite sulle viste che specificano la clausola WITH CHECK OPTION e create su tabelle remote, anche nel caso in cui tali operazioni non rientrino nei limiti dell'istruzione SELECT della vista.
SQL Server 2005 esegue l'acknowledgement della clausola WITH CHECK OPTION quando vengono eseguite operazioni di inserimento e aggiornamento sulle viste create su tabelle da origini dei dati remote.
Se le operazioni di inserimento e modifica hanno esito negativo sulle viste create su tabelle remote a causa della clausola WITH CHECK OPTION e si desidera evitare questo comportamento, modificare la vista omettendo tale clausola.
Per ulteriori informazioni, vedere CREATE VIEW (Transact-SQL), ALTER VIEW (Transact-SQL) e Modifica di dati tramite una vista.
xp_cmdshell
Quando viene generato un errore nell'esecuzione di xp_cmdshell, viene generato un messaggio di errore ma l'esecuzione non viene interrotta.
Quando viene generato un errore nell'esecuzione di xp_cmdshell, viene generato un messaggio di errore e l'esecuzione viene interrotta.
Vedere anche
Riferimento
Modifiche che possono causare problemi di funzionamento apportate alle funzionalità del Motore di database in SQL Server 2005.
Funzionalità del Motore di database obsolete in SQL Server 2005
Funzionalità del Motore di database non più utilizzate in SQL Server 2005
Altre risorse
Compatibilità con le versioni precedenti del Motore di database di SQL Server 2005
sp_dbcmptlevel (Transact-SQL)
Guida in linea e informazioni
Cronologia modifiche
Versione | Cronologia |
---|---|
17 luglio 2006 |
|
5 dicembre 2005 |
|