Verhaltensänderungen von Datenbankmodul-Features in SQL Server 2005

Aktualisiert: 17. Juli 2006

In diesem Thema werden die Verhaltensänderungen einiger Datenbankmodul-Features in Microsoft SQL Server 2005 im Vergleich zu früheren Versionen von SQL Server beschrieben.

Sicherung und Wiederherstellung

Beim Wiederherstellen einer vorhandenen Datenbank müssen Sie in SQL Server 2005 das Protokollfragment sichern, bevor Sie die Datenbank unter dem vollständigen oder massenprotokollierten Modell wiederherstellen. Wenn Sie versuchen, eine Datenbank wiederherzustellen, ohne vorher das Protokollfragment zu sichern, wird ein Fehler ausgegeben, es sei denn, die RESTORE-Anweisung enthält entweder eine WITH REPLACE- oder eine WITH STOPAT-Klausel. Weitere Informationen finden Sie unter Sicherungen des Protokollfragments.

Cursor

In der folgenden Tabelle werden die impliziten Cursorkonvertierungen aufgelistet, die in SQL Server 2000, jedoch nicht in SQL Server 2005 auftreten. Anstelle der impliziten Konvertierung wird der bestimmte Cursortyp angefordert, um das Problem zu beheben.

Bedingung Konvertierung des Cursors in SQL Server 2000 von In

In der Abfrage ist eine Inlinetabellenfunktion enthalten.

DYNAMIC-/Keysetcursor

STATIC-Cursor

Die Abfrage verweist auf ein Remoteobjekt.

FAST_FORWARD-Cursor

Keysetcursor

In der Abfrage sind keine Tabellen enthalten.

FAST_FORWARD-Cursor

STATIC-Cursor

In der Abfrage ist eine Tabellenfunktion enthalten.

FAST_FORWARD-Cursor

STATIC-Cursor

In der Abfrage ist eine abgeleitete Tabelle enthalten.

FAST_FORWARD-Cursor

STATIC-Cursor

In der Abfrage ist eine Tabellenwertfunktion mit mehreren Anweisungen enthalten.

DYNAMIC-Cursor

Keysetcursor

Keysetcursor zu STATIC-Cursor

STATIC-Cursor

In der Abfrage ist eine virtuelle Tabelle enthalten.

DYNAMIC-/Keysetcursor

STATIC-Cursor

In der Abfrage ist eine Sicht mit einer TOP-Klausel enthalten.

FAST_FORWARD-Cursor

STATIC-Cursor

In der Abfrage sind aktualisierbare partitionierte Sichten enthalten.

FAST_FORWARD-Cursor

STATIC-Cursor

In der API-Cusorabfrage ist eine indizierte Sicht mit einer eindeutigen Zugriffsmethode enthalten, jedoch nicht auf Basistabellenebene.

Keysetcursor

STATIC-Cursor

In der API-Cursorabfrage ist eine Tabelle mit keinem gruppierten Index oder eindeutigem Schlüssel enthalten.

Keysetcursor

STATIC-Cursor

Im API-Cursorresultset ist eine text-, ntext- oder image-Spalte enthalten.

FAST_FORWARD-Cursor

DYNAMIC-Cursor

In SQL Server 2005 wird das asynchrone Generieren von keysetgesteuerten oder statischen Transact-SQL-Cursorn nicht unterstützt. Transact-SQL-Cursorvorgänge, wie z. B. OPEN oder FETCH, sind normalerweise in Batches enthalten. Daher ist das asynchrone Generieren von Transact-SQL-Cursorn nicht erforderlich. In SQL Server 2005 werden weiterhin asynchrone keysetgesteuerte oder statische API-Servercursor unterstützt, wobei OPEN mit geringer Wartezeit ein Problem darstellt. Dies ist auf Clientroundtrips zurückzuführen, die für jeden Cursorvorgang ausgeführt werden.

Wenn in SQL Server 2005 ein dynamischer Cursor für eine Tabelle mit keinen eindeutigen Indizes deklariert wird, und eine Zeile wird außerhalb des Cursors gelöscht, so wird bei einer nachfolgenden Aktualisierung ein Platzhalter für die Zeile mit NULL-Daten abgerufen. In früheren Versionen von SQL Server gibt der Cursor nicht die betroffene Zeile zurück.

Wenn in SQL Server 2005 verschiedene Cursordeklarationen durch Bedingungslogik innerhalb eines Batches oder einer gespeicherten Prozedur möglich sind, bewirken die durch den Cursor ausgeführten INSERT-, UPDATE- und DELETE-Anweisungen eine Neukompilierung. In SQL Server 2000 bewirken diese Anweisungen keine Neukompilierung.

Im folgenden Beispiel bewirkt die UPDATE-Anweisung die Neukompilierung des Moduls.

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

Schreiben Sie zur Vermeidung der Neukompilierung den Code folgendermaßen um:

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 erfolgt der Abruf eines Sperrenupdates über Cursorscrollsperren von S (Shared) auf U (Update), es sei denn, ein höherer Sperrhinweis wird in der Abfrage angegeben. In SQL Server 2000 wird ein U-Sperrhinweis für Cursorscrollsperren transparent hinzugefügt. Das SQL Server 2005-Verhalten ermöglicht eine bessere Parallelität. Bei gleichzeitigen Cursorn erhöht sich jedoch auch die Gefahr von Deadlocks (Meldung 1205). Verwenden Sie den UPDLOCK-Hinweis, um das von Ihnen gewünschte Verhalten zu erreichen. Weitere Informationen finden Sie unter Tabellenhinweis (Transact-SQL).

Wenn in SQL Server 2000 ein in einem Cursorfetchpuffer mehrfach angezeigter Spalten- oder Zeilenwert aktualisiert wird, kann es sein, dass die anderen Vorkommen die Aktualisierung aufgrund der Größe des Fetchpuffers oder der Position der Zeilen innerhalb des Puffers nicht widerspiegeln. In SQL Server 2005 werden die Zeilen im Fetchpuffer so aktualisiert, dass die Werte stets konsistent sind, unabhängig von der Größe des Fetchpuffers oder der Position der Zeilen.

In SQL Server 2000 geben Cursor, die eine UNION ALL-Anweisung einschließen, falsche Aktualisierbarkeitsinformationen auf Basis des ersten Sets der UNION-Anweisung zurück. Aus diesem Grund werden einige Cursor, die nicht aktualisierbar sind, als aktualisierbar berichtet. In SQL Server 2005 werden UNION ALL-Ergebnisse als berechnet und daher als nicht aktualisierbar berichtet. Wenn alle Cursorzeilen aus einer einzelnen Tabelle oder Sicht stammen, können Sie einen aktualisierbaren Cursor definieren. Ändern Sie hierzu die Abfrage so, dass IN- oder OR-Klauseln anstelle von UNION-Klauseln verwendet werden.

Wenn in SQL Server 2000 die CURSOR_CLOSE_ON_COMMIT-Option auf ON festgelegt ist, werden alle Cursor einer Verbindung nach der Ausführung eines Commits für die Transaktion geschlossen. In SQL Server 2005 werden bei Ausführung eines Commits für die Transaktion nur Cursor geschlossen, die innerhalb der aktuellen Transaktion geöffnet werden. Cursor, die vor Beginn der Transaktion geöffnet werden, bleiben weiterhin offen.

SQL Server 2000 lässt einige Cursordeklarationen zu, die nicht gültig sind, und konvertiert sie in andere Cursortypen. SQL Server 2005 lässt keine Deklarationen zu, die nicht gültig sind. Beispielsweise ist ein Cursor, der sowohl Aktualisierbarkeit als auch Insensitivität anfordert, in SQL Server 2005 nicht gültig und führt zu einem Fehler.

Datenbanken, Daten und Protokolldateien

Verhalten von SQL Server 2000 Verhalten von SQL Server 2005

Bei der AUTO_CLOSE-Datenbankoption handelt es sich um einen synchronen Prozess, der die Leistung beeinträchtigen kann, wenn durch eine Anwendung, die wiederholt Verbindungen mit Datenbankmodul herstellt und diese unterbricht, auf die Datenbank zugegriffen wird.

Der AUTO_CLOSE-Prozess erfolgt asynchron. Das wiederholte Öffnen und Schließen der Datenbank führt nicht mehr zur Beeinträchtigung der Leistung.

Dateien auf Rohdatenpartitionen vergrößern sich nicht automatisch. Daher werden die MAXSIZE- und FILEGROWTH-Parameter nicht benötigt, wenn os_file_name eine Rohdatenpartition angibt.

Dateien auf Rohdatenpartitionen können sich automatisch vergrößern. Die MAXSIZE- und FILEGROWTH-Parameter können angegeben werden.

Die Berechtigungen für die Daten und Protokolldateien der einzelnen Datenbanken werden nicht festgelegt.

Die Berechtigungen für die Daten und Protokolldateien werden festgelegt, wenn die folgenden Vorgänge für die Datenbank angewendet werden:

ErstellenÄndern, um eine neue Datei hinzuzufügen
AnfügenSichern
TrennenWiederherstellen

Durch die Berechtigungen wird verhindert, dass die Dateien versehentlich manipuliert werden, wenn sie sich in einem Verzeichnis mit offenen Berechtigungen befinden. Weitere Informationen finden Sie unter Sichern von Daten- und Protokolldateien.

ms143359.note(de-de,SQL.90).gifHinweis:

Microsoft SQL Server 2005 Express Edition legt keine Berechtigungen für Daten und Protokolldateien fest.

Verbindungsserver und verteilte Abfragen

Ein Verbindungsserver, der mit dem Anbieternamen 'SQLOLEDB' definiert wurde, wird beim Update in 'SQLNCLI' (SQL Native Client OLE DB-Anbieter) geändert. Die sys.sysservers-Kompatibilitätssicht zeigt Verbindungsserver an, die 'SQLNCLI' als 'SQLOLEDB' verwenden. Die sys.servers-Katalogsicht in SQL Server 2005 zeigt Verbindungsserver an, die 'SQLNCLI' als 'SQLNCLI' verwenden.

Heterogene Abfragen und die Verwendung von OLE DB-Anbietern werden nicht unterstützt, wenn SQL Server im Fibermodus ausgeführt wird. Der Fibermodus ist aktiviert, wenn die erweiterte Konfigurationsoption lightweight pooling auf 1 festgelegt ist.

Der SQL Native Client OLE DB-Anbieter kann nicht außerhalb des Prozesses instanziiert werden.

Warnmeldungen eines Verbindungsservers in SQL Server 2005 werden nicht an den Client weitergegeben. Die wichtigsten Klassen solcher Warnungen sind:

  • ANSI-kompatible Warnungen darüber, dass NULL-Werte in einer Aggregatberechnung gelöscht wurden.
  • Arithmetische Überlaufwarnungen

Beispielsweise wird über die folgende Transact-SQL-Anweisung eine Warnmeldung generiert, wenn in col1 NULL-Werte vorhanden sind:

SELECT SUM(col1)
FROM <Table>
GROUP BY col2 

In SQL Server 2000 und in früheren Versionen geben Verbindungsserver die Warnmeldung an den Client weiter. In SQL Server 2005 ist dies bei Verbindungsservern nicht der Fall.

Wenn in SQL Server 2000 eine remote gespeicherte Prozedur (remote stored procedure) aufgrund von Kompilierzeitfehlern (z. B. eine falsche Parameterbindung) nicht erfolgreich ausgeführt werden kann, wird der Rückgabewert/-status auf 0 festgelegt. Wenn dieses Szenario in SQL Server 2005 auftritt, wird der Rückgabewert/Status auf NULL festgelegt.

Architektur des Abfrageprozessors

Das Verwenden von Parameterwerten bei der Neukompilierung erfolgt in SQL Server 2000 und SQL Server 2005 für Batches, die auf folgende Art und Weise übergeben wurden, unterschiedlich:

  • Gespeicherte Prozeduren
  • Verwenden von sp_executesql
  • Vorbereitete Anweisungen

Beim Neukompilieren dieser Batches in SQL Server 2000 werden die Parameterwerte verwendet, mit denen die Batches als Teil der Neukompilierung bezeichnet werden. Beim Neukompilieren dieser Abfragen in SQL Server 2005 werden die kurz vor der Anweisung vorhandenen Parameterwerte verwendet, die die Neukompilierung bewirken. Diese Werte können sich von den an den Batch ursprünglich übergebenen Werten unterscheiden. Weitere Informationen finden Sie unter Parameter und Wiederverwendung von Ausführungsplänen.

Sicherheit

Feature Verhalten von SQL Server 2000 Verhalten von SQL Server 2005

GRANT ALL

Erteilt alle anwendbaren Berechtigungen.

Das Erteilen der ALL-Berechtigung für Objekte und Anweisungen wurde als veraltet markiert. Bei Ausführung von GRANT ALL tritt folgende Situation ein:

  • Der Befehl wird erfolgreich ausgeführt. Dem Benutzer werden jedoch nur die in SQL Server 2000 erteilbaren Berechtigungen erteilt.
  • Die folgende Meldung wird angezeigt: "Die ALL-Berechtigung ist als veraltet markiert und wird nur aus Kompatibilitätsgründen beibehalten. Sie beinhaltet NICHT für die Entität definierte ALL-Berechtigungen."

In SQL Server 2005 werden zusätzliche Berechtigungen in verschiedenen Bereichen bereitgestellt, die zum Verwalten von Benutzerberechtigungen verwendet werden können. Die CONTROL-Berechtigung kann beispielsweise verwendet werden, um besitzähnliche Berechtigungen für ein Objekt zu erteilen.

Kennwortvergleiche

SQL Server 2000 verwaltet zwei Versionen jedes SQL Server-Anmeldekennwortes. Eine Version ist das tatsächliche, vom Benutzer angegebene Kennwort, die andere das von SQL Server in Großbuchstaben konvertierte Kennwort. Auf diese Weise wird die Überprüfung der Kennwörter ohne Unterscheidung nach Groß-/Kleinschreibung ermöglicht. Obwohl dieses Verhalten für viele Benutzer hilfreich ist, ergibt sich durch die Reduzierung der Anzahl möglicher Kennwörter eine erhöhte Gefahr von Kennwortangriffen.

Nur das tatsächliche Kennwort wird gespeichert. Ein von einem Benutzer eingegebenes Kennwort muss mit dem im Server gespeicherten Kennwort übereinstimmen. Stimmt ein Kennwort nicht mit dem in SQL Server gespeicherten Kennwort überein, erzeugt die Anmeldung einen Fehler. Wenn sich der Benutzer nicht mehr an die Groß-/Kleinschreibung des Kennwortes erinnern kann, muss das Kennwort zurückgesetzt werden.

Ändern der Standardsprache für das sa-Konto

Die Standardsprache für das SQL Server sa-Konto ist die Sprache, die während des Setups oder Updates ausgewählt wurde.

In früheren Versionen von Microsoft SQL Server wird durch das Ausführen von sp_configure zum Ändern der Standardsprache des Servers auch die Standardsprache für das sa-Konto aktualisiert.

Um die Standardsprache für das sa-Konto in SQL Server 2005 zu ändern, müssen Sie die gespeicherte Prozedur sp_defaultlanguage und den Befehl DBCC FREESYSTEMCACHE ausführen und dann eine neue Sitzung starten. Durch das Ausführen von sp_configure zum Ändern der Standardsprache für den Server wird die Standardsprache für das sa-Konto nicht aktualisiert.

Gespeicherte Systemprozeduren

In der folgenden Tabelle werden die Parameteränderungen in den gespeicherten Systemprozeduren von Datenbankmodul aufgelistet.

Gespeicherte Prozedur Parameter Beschreibung der Änderung

sp_bindefault

@objname

Größenänderung von nvarchar(517) in nvarchar(776).

sp_bindrule

@objname

Größenänderung von nvarchar(517) in nvarchar(776).

sp_changeobjectowner

@objname

Größenänderung von nvarchar(517) in nvarchar(776).

sp_detach_db

@keepfulltextindexfile

Größenänderung von nvarchar(517) in nvarchar(776).

sp_fulltext_service

@action

Größenänderung von varchar(20) in nvarchar(100).

sp_fulltext_service

@value

Datentypänderung von int in sql_variant.

sp_getapplock

@DbPrincipal

Hinzufügen eines Parameters.

sp_releaseapplock

@DbPrincipal

Hinzufügen eines Parameters.

sp_setapprole

@fCreateCookie

Hinzufügen eines Parameters.

sp_setapprole

@cookie

Hinzufügen eines Parameters.

sp_settriggerorder

@stmttype

Größenänderung von varchar(10) in varchar(50).

sp_settriggerorder

@namespace

Hinzufügen eines Parameters.

sp_sproc_columns

@fUsePattern

Hinzufügen eines Parameters.

sp_stored_procedures

@fUsePattern

Hinzufügen eines Parameters.

sp_table_privileges

@fUsePattern

Hinzufügen eines Parameters.

sp_table_privileges_ex

@fUsePattern

Hinzufügen eines Parameters.

sp_tables

@fUsePattern

Hinzufügen eines Parameters.

sp_tables_ex

@fUsePattern

Hinzufügen eines Parameters.

Systemtabellen und -sichten

In der folgenden Tabelle werden die Spaltenänderungen in Systemtabellen und -sichten aufgelistet.

Systemtabelle oder Systemsicht Spalte Beschreibung der Änderung

COLUMNS

ORDINAL_POSITION

Datentypänderung von smallint in int.

PARAMETERS

ORDINAL_POSITION

Datentypänderung von smallint in int.

REFERENTIAL_CONSTRAINTS

MATCH_OPTION

Größenänderung von varchar(4) in varchar(7).

Standardwertänderung von 'NONE' in 'SIMPLE'.

REFERENTIAL_CONSTRAINTS

UPDATE_RULE

Größenänderung von varchar(9) in varchar(11).

REFERENTIAL_CONSTRAINTS

DELETE_RULE

Größenänderung von varchar(9) in varchar(11).

ROUTINE_COLUMNS

ORDINAL_POSITION

Datentypänderung von smallint in int.

sysaltfiles

name

Datentypänderung von nchar(128) in sysname.

sysaltfiles

filename

Datentypänderung von nchar(260) in nvarchar(260).

sysconfigures

config

Datentypänderung von smallint in int.

syscursorcolumns

data_type_sql

Datentypänderung von smallint in int.

sysfiles

name

Datentypänderung von nchar(128) in sysname.

sysfiles

filename

Datentypänderung von nchar(260) in nvarchar(260).

sysmessages

severity

Datentypänderung von smallint in tinyint.

sysperfinfo

cntr_value

Datentypänderung von int in bigint.

sysprocesses

waittime

Datentypänderung von int in bigint.

sysprocesses

hostprocess

Größenänderung von nchar(8) in nchar(10).

sysprocesses

request_id

Hinzufügen einer Spalte.

sysprotects

columns

Größenänderung von varbinary(4000) in varbinary(8000).

sysservers

srvcollation

Datentypänderung von int in sysname.

sysservers

nonsqlsub

Hinzufügen einer Spalte.

sysoledbusers

rmtpassword

Gibt nur NULL zurück.

sysindexes

keys

Gibt nur NULL zurück.

sysindexes

statblob

Gibt nur NULL zurück.

syscomments

compressed

Gibt nur 0 zurück.

sysdevices

size

Gibt nur 0 zurück.

sysobjects

schema_ver

Gibt nur 0 zurück.

sysremotelogins

status

Gibt nur 0 zurück.

sysservers

topologyx

Gibt nur 0 zurück.

sysservers

topologyy

Gibt nur 0 zurück.

Transact-SQL

Feature Verhalten von SQL Server 2000 Verhalten von SQL Server 2005

Dienstprogramm bcp

Ein Benutzer, der über die INSERT- und SELECT-Berechtigungen für eine Tabelle verfügt, kann das Dienstprogramm bcp zum Massenladen von Daten in diese Tabelle mit folgendem Befehl verwenden:

bcp <target table> in 
<datafile> -c -T

Mit diesem Befehl werden standardmäßig CHECK-Einschränkungen und Trigger auf Zieltabellen deaktiviert.

Zum Ausführen des Dienstprogramms bcp muss ein Benutzer über die ALTER-Berechtigung sowie über die INSERT- und SELECT-Berechtigungen auf Zieltabellen verfügen, wenn CHECK-Einschränkungen und Trigger beim Massenladevorgang deaktiviert werden. Nach dem Update auf SQL Server 2005 können bcp-Befehle in Anwendungen möglicherweise aufgrund unzureichender Berechtigungen zu Fehlern führen. Dieses Problem kann auf eine der folgenden Arten behoben werden:

  • Erteilen Sie dem Benutzer die ALTER TABLE-Berechtigung für alle Tabellen, die am bcp-Vorgang beteiligt sind.
  • Ändern Sie den bcp-Befehl so, dass CHECK-Einschränkungen und Trigger, wie im folgenden Beispiel dargestellt, erzwungen werden:

    bcp <target table> 
    in <datafile> -c -T -h 
    "CHECK_CONSTRAINTS, 
    FIRE_TRIGGERS"

Integrierte Systemfunktionen

Die Verweise auf integrierte Funktionen, wie z. B. NEWID und RAND, führen alle zu unterschiedlichen Ergebnissen. Der Grund dafür liegt darin, dass jede Funktion für jeden einzelnen äußeren Abfrageverweis ausgewertet wird.

Eine äußere Abfrage kann mehrere Verweise auf Spalten von Sichten oder abgeleiteten Tabellen aufweisen. Wenn diese Spalten jedoch durch den Aufruf von Funktionen, wie z. B. NEWID und RAND, definiert werden, bewirken diese mehreren Verweise, dass die Funktion nur einmal für jeden tatsächlichen Aufruf innerhalb der Sicht oder abgeleiteten Tabelle ausgewertet wird.

Mehrere Verweise auf solche Spalten einer Unterabfrage bewirken nicht die mehrfache Auswertung der Funktionen. Auf diese Weise können Sie den von den Funktionen der Unterabfrage erzeugten Wert erneut verwenden.

In SQL Server 2000 gibt z. B. die folgende Abfrage zwei unterschiedliche Werte zurück. In SQL Server 2005 gibt die Abfrage einen einzelnen Wert zurück.

SELECT Column1, Column1
      FROM (
            SELECT RAND() Column1
            FROM (
            SELECT 1 c
            UNION
            SELECT 2 c
                  ) s
            ) t

BULK INSERT

BULK INSERT unterstützt die Typkonvertierung von String in Decimal für Zeichenfolgen, die numerische Werte in wissenschaftlicher Schreibweise darstellen.

Für die in BULK INSERT verwendeten Typkonvertierungen von String in Decimal gelten dieselben Regeln wie für die Transact-SQL CONVERT-Funktion. Diese Funktion lehnt Zeichenfolgen ab, die numerische Werte mit wissenschaftlicher Schreibweise darstellen. Daher behandelt BULK INSERT solche Zeichenfolgen als ungültige Werte und berichtet Konvertierungsfehler. Weitere Informationen finden Sie unter BULK INSERT (Transact-SQL).

datetime-Konvertierungen

Konvertierungen von String in datetime werden als deterministisch markiert. Dies gilt jedoch nicht für die in der folgenden Tabelle aufgelisteten Formate. Bei diesen Formaten hängen die Konvertierungen von den jeweiligen Spracheneinstellungen ab.

In der folgenden Tabelle werden die Formate aufgelistet, für die die Konvertierung von String in datetime nicht deterministisch ist.

Alle Formate unter 1001106
107109
113130

1 Mit Ausnahme von Format 20 und 21

SQL Server 2005 markiert Konvertierungen von Zeichenfolge in datetime als nicht deterministisch.

DBCC CHECKFILEGROUP

Wenn ein nicht gruppierter Index in der angegebenen Dateigruppe einer Tabelle in einer anderen Dateigruppe zugeordnet ist, werden der Index und die Basistabelle in der anderen Dateigruppe überprüft.

Wenn ein nicht gruppierter Index in der angegebenen Dateigruppe einer Tabelle in einer anderen Dateigruppe zugeordnet ist, wird der Index nicht geprüft, weil die Basistabelle nicht zur Überprüfung verfügbar ist.

DBCC SHOW_STATISTICS

Das von DBCC SHOW_STATISTICS zurückgegebene Rowset enthält keine Name-Spalte.

Das erste von DBCC SHOW_STATISTICS zurückgegebene Rowset enthält eine zusätzliche Spalte mit dem Titel Name. Diese Spalte wird im Resultset als erste Spalte angezeigt. Wenn Sie über Anwendungen verfügen, die auf von DBCC SHOW_STATISTICS über die Ordnungsposition zurückgegebene Spalten zugreifen, müssen Sie diese ändern, um den Zugriff auf diese Spalten über den Namen zu ermöglichen.

DROP LOGIN

Beim Ausführen von DROP LOGIN wird die Anmeldung nicht gelöscht, wenn Datenbankbenutzer der Anmeldung zugeordnet sind.

Beim Ausführen von DROP LOGIN wird die Anmeldung gelöscht, selbst wenn Datenbankbenutzer der Anmeldung zugeordnet sind.

Ausdrücke in berechneten Spalten, CHECK-Einschränkungen und DEFAULT-Einschränkungen

Der ursprüngliche Text eines Ausdrucks, einschließlich der Leerzeichen, wird in den Katalogmetadaten beibehalten. Ein als c1 + c2 + 1 eingegebener berechneter Spaltenausdruck wird beispielsweise genauso angezeigt, wie er in der text-Spalte in der syscomments-Systemtabelle eingegeben wird.

Der ursprüngliche Text eines Ausdrucks wird decodiert und normalisiert, und die Ausgabe dieses Vorgangs wird in den Katalogmetadaten gespeichert. Die Semantik des decodierten Ausdrucks entspricht dem ursprünglichen Text. Es gibt jedoch keine syntaktische Garantie. Ein als c1 + c2 + 1 eingegebener berechneter Spaltenausdruck wird beispielsweise in der Definitionsspalte in der sys.computed_columns-Systemkatalogsicht als (([c1]+[c2])+(1)) angezeigt.

Ausdrücke in Abfragen

Unsichere Ausdrücke in Abfragen generieren nicht immer eine Laufzeitausnahme.

In SQL Server 2005 werden Ausdrücke in Abfragen häufig früher ausgewertet als in SQL Server 2000. Dieses Verhalten bietet die folgenden wichtigen Vorteile:

  • Die Möglichkeit, dass Indizes auf berechneten Spalten den Ausdrücken in einer Abfrage entsprechen, die mit dem berechneten Spaltenausdruck identisch sind.
  • Das Verhindern redundanter Berechnungen von Ausdrucksergebnissen.

Abhängig von der Art der Abfrage und der in der Datenbank enthaltenen Daten in SQL Server 2005 können jedoch Laufzeitausnahmen auftreten, wenn die Abfrage einen bereits vorhandenen unsicheren Ausdruck enthält. Hierzu gehören die folgenden Laufzeitausnahmen:

  • Arithmetische Ausnahmen: Division durch Null, Überlauf und Unterlauf.
  • Konvertierungsfehler, wie z. B. der Verlust der Genauigkeit und der Versuch, eine nicht numerische Zeichenfolge in eine Zahl zu konvertieren.
  • Aggregation über einen Satz von Werten, bei denen nicht sichergestellt ist, dass sie alle ungleich NULL sind.

Es kann sein, dass diese Ausnahmen in SQL Server 2000 in einer bestimmten Anwendung, die bestimmte Daten verwendet, nicht auftreten. Ein Abfrageplan, der aufgrund von sich ändernden Statistiken geändert wurde, kann jedoch potenziell zu einer Ausnahme in SQL Server 2000 führen. Diese Laufzeitausnahmen können vermieden werden, indem Sie die Abfrage so ändern, dass bedingte Ausdrücke, wie z. B. NULLIF oder CASE, verwendet werden. Weitere Informationen finden Sie unter Problembehandlung bei Fehlern und Warnungen zu Abfrageausdrücken.

fn_servershareddrives

Die von der Systemfunktion fn_servershareddrives zurückgegebenen Daten können von Mitgliedern der public-Rolle angezeigt werden.

Berechtigungsänderung: fn_servershareddrives erfordert, dass der Benutzer über die VIEW SERVER STATE-Berechtigung auf dem Server verfügt.

ms143359.note(de-de,SQL.90).gifWichtig:

Diese SQL Server 2000-Systemfunktion wird aus Gründen der Abwärtskompatibilität bereitgestellt. Es wird empfohlen, stattdessen die Systemfunktion sys.dm_io_cluster_shared_drives zu verwenden.

fn_virtualfilestats

Die von der Systemfunktion fn_virtualfilestatss zurückgegebenen Daten können von Mitgliedern der public-Rolle angezeigt werden.

Berechtigungsänderung: fn_virtualfilestats erfordert, dass der Benutzer über die VIEW SERVER STATE-Berechtigung auf dem Server verfügt.

fn_virtualservernodes

Die von der Systemfunktion fn_virtualservernodes zurückgegebenen Daten können von Mitgliedern der public-Rolle angezeigt werden.

Berechtigungsänderung: fn_virtualservernodes erfordert, dass der Benutzer über die VIEW SERVER STATE-Berechtigung auf dem Server verfügt.

ms143359.note(de-de,SQL.90).gifWichtig:

Diese SQL Server 2000-Systemfunktion wird aus Gründen der Abwärtskompatibilität bereitgestellt. Es wird empfohlen, stattdessen die Systemfunktion sys.dm_os_cluster_nodes zu verwenden.

HOST_ID

HOST_ID gibt einen char(8)-Wert zurück.

HOST_ID gibt einen char(10)-Wert zurück.

Indizes

Die in der Spalte "Verhalten von SQL Server 2005" beschriebenen Indizes sind zulässig.

Die folgenden Indizes können möglicherweise während des Updateprozesses deaktiviert werden. Es ist auch möglich, dass sie aufgrund von in SQL Server 2005 eingeführten Änderungen neu erstellt werden müssen:

  • Indizes auf berechneten Spalten, die CHECKSUM verwenden (some_timestamp_column), werden deaktiviert, da sich das Verhalten der Transact-SQL-CHECKSUM-Funktion geändert hat, wenn sie eine timestamp-Spalte als ein Argument verwendet.
  • Für Indizes, die die Zeichenwerte 0x3390, 0x33ca oder 0x33cb in nvarchar-Spalten oder nchar-Spalten mit Türkisch-basierter Sortierung verwenden, kann die Neuerstellung erforderlich sein, da sich das Sortierverhalten dieser Sortierungen geändert hat.
  • Indizes auf berechneten Spalten oder Sichten, in denen die Sicht oder der berechnete Spaltenausdruck entweder eine implizite Konvertierung von String in datetime oder in smalldatetime bzw. eine explizite, nicht deterministische Konvertierung von String in datetime oder in smalldatetime beinhaltet, werden deaktiviert.

Befolgen Sie für Indizes, für die das Neuerstellen aufgrund der oben in den ersten zwei Punkten beschriebenen Änderungen erforderlich ist, die folgende Prozedur.

  1. Überprüfen Sie, ob im SQL Server-Fehlerprotokoll die Warnmeldungen 3801, 3803 oder 3804 enthalten sind.

  2. Führen Sie DBCC CHECKTABLE auf der zugrunde liegenden Tabelle aus, um zu überprüfen, ob ein Problem vorliegt.

  3. Wenn die Ergebnisse der DBCC-Anweisungen auf ein Problem hinweisen, erstellen Sie den Index neu. Verwenden Sie hierzu eine der folgenden Methoden:

    • ALTER INDEX-Anweisung mit der REBUILD-Klausel
    • CREATE INDEX mit der DROP_EXISTING-Klausel
    • DBCC DBREINDEX
  4. Identifizieren Sie deaktivierte FOREIGN KEY-Einschränkungen mithilfe der folgenden Anweisung:

    SELECT * FROM sys.foreign_keys 
    WHERE is_disabled=1;
    
  5. Aktivieren Sie jede FOREIGN KEY-Einschränkung mithilfe der ALTER TABLE CHECK CONSTRAINT-Anweisung.
    PRIMARY KEY- und UNIQUE-Einschränkungen werden durch das Neuerstellen des zugeordneten Indexes aktiviert. Dieser Index muss neu erstellt werden, bevor Sie die FOREIGN KEY-Einschränkungen, die auf die PRIMARY KEY- oder UNIQUE-Einschränkung verweisen, aktivieren können.

Befolgen Sie für Indizes, die aufgrund der oben im dritten Punkt beschriebenen Änderungen deaktiviert wurden, die folgenden schrittweisen Anleitungen.

  1. Identifizieren Sie die Indizes auf berechneten Spalten, die aktiviert wurden. Verwenden Sie hierzu die folgende Anweisung:

    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
    
  2. Löschen Sie bei einem berechneten Spaltenindex den Index, und ändern Sie dann die Definition der berechneten Spalte, um eine explizite CONVERT-Funktion mit einem deterministischen Datumsformat zu verwenden.

  3. Löschen Sie bei einer indizierten Sicht die Sicht, und definieren Sie sie neu, indem Sie eine explizite CONVERT-Funktion mit einem deterministischen Datumsformat verwenden.

  4. Erstellen Sie den Index erneut für eine geänderte berechnete Spalte oder Sicht.

Indizes

Parallele Indexvorgänge werden in SQL Server 2000 Developer Edition, SQL Server 2000 Standard Edition und SQL Server 2000 Enterprise Edition unterstützt.

Parallele Indexvorgänge, die Indizes erstellen, löschen oder neu erstellen, sind nur in SQL Server 2005 Developer Edition und SQL Server 2005 Enterprise Edition verfügbar.

Benutzer, die ein Update von SQL Server 2000 Standard Edition auf SQL Server 2005 Standard Edition vornehmen, sollten beachten, dass Vorgänge, die Indizes erstellen, löschen oder neu erstellen, in SQL Server 2005 Standard Edition seriell ausgeführt werden und deshalb mehr Zeit in Anspruch nehmen können.

SELECT-, INSERT-, UPDATE- und DELETE-Anweisungen sind davon nicht betroffen. Diese werden in SQL Server 2005 Standard Edition parallel verwendet.

Überwachen Sie nach dem Update auf SQL Server 2005 Standard Edition die Vorgänge, die Indizes erstellen, löschen oder neu erstellen. Es ist möglich, dass Sie Wartungsskripts oder geplante Wartungsaktivitäten anpassen müssen, um zusätzliche Zeit für diese Vorgänge zuzulassen.

Installieren Sie SQL Server 2005 Enterprise Edition zum Ausführen paralleler Indexvorgänge.

ORDER BY-Klausel

Spaltennamen in der ORDER BY-Klausel werden in Spalten aufgelöst, die in der Auswahlliste aufgelistet sind, unabhängig davon, ob sie qualifiziert sind oder nicht.

Die folgende Abfrage wird beispielsweise ohne Fehler ausgeführt:

USE pubs
SELECT au_fname AS 'FName',
  au_lname AS 'LName'
FROM authors a
ORDER BY a.LName

SQL Server ignoriert den a-Qualifizierer in der ORDER BY-Klausel und löst den LName-Spaltennamen in die Auswahlliste auf.

Qualifizierte Spaltennamen und -aliase werden in Spalten von Tabellen aufgelöst, die in der FROM-Klausel aufgelistet sind. Wenn order_by_expression nicht qualifiziert wird, muss dieser Wert unter allen in der SELECT-Anweisung aufgelisteten Spalten eindeutig sein.

Beispielsweise wird über die folgende entsprechende Abfrage ein Fehler zurückgegeben:

USE AdventureWorks
SELECT FirstName AS 'FName',
    LastName AS 'LName'
FROM Person.Contact p
ORDER BY p.LName

SQL Server ignoriert den p-Qualifizierer in der ORDER BY-Klausel nicht und löst den LName-Spaltennamen in Tabellen auf, die in der FROM-Klausel aufgelistet sind. Die FROM-Klausel erkennt jedoch nicht, dass diese LName-Spalte ein Spaltenalias der p-Tabelle ist.

SERVERPROPERTY-Funktion

Der Rückgabetyp der ProductVersion-Eigenschaft in der SERVERPROPERTY-Funktion lautet varchar.

Der Rückgabetyp der ProductVersion-Eigenschaft in der SERVERPROPERTY-Funktion lautet nvarchar

sp_addtype

Jeder beliebiger Benutzer kann sp_addtype ausführen.

Der Benutzer muss ein Mitglied der db_ddladmin- oder db_owner-Datenbankrolle sein, um sp_addtype auszuführen.

Damit Benutzer Aliasdatentypen erstellen können, muss eine der folgenden Änderungen durchgeführt werden:

  • Fügen Sie der db_ddladmin- oder db_owner-Datenbankrolle die Benutzer hinzu, die die sp_addtype ausführen sollen.
  • Erteilen Sie den Benutzern die CREATE TYPE-Berechtigung und den Benutzern auf dem Zielschema die ALTER-Berechtigung, um einen Aliasdatentyp mithilfe von CREATE TYPE zu erstellen.

sp_altermessage

sp_altermessage kann verwendet werden, um anzugeben, ob eine Systemmeldung (eine Meldung mit der Meldungs-ID < 50000) in das Windows-Anwendungsprotokoll geschrieben werden soll oder nicht.

sp_altermessage kann nicht verwendet werden, um das Protokollverhalten von Systemmeldungen (Meldungen mit der Meldungs-ID < 50000) zu ändern. Verwenden Sie die SQL-Ablaufverfolgung und die User Error Message-Ereignisklasse zur Überwachung von Systemmeldungen. Weitere Informationen finden Sie unter Einführung in die SQL-Ablaufverfolgung.

sp_changedbowner

Nur Mitglieder der festen Serverrolle sysadmin, der festen Datenbankrolle db_owner bzw. ein Mitglied der festen Datenbankrollen db_ddladmin und db_securityadmin können sp_changeobjectowner ausführen.

Einem Benutzer, der diese gespeicherte Prozedur als Mitglied der festen Datenbankrollen db_ddladmin und db_securityadmin ausführen kann, muss ebenfalls die CONTROL-Berechtigung für das sicherungsfähige Element erteilt werden. Das Ausführen von sp_changeobjectowner ohne die CONTROL-Berechtigung auf dem Zielobjekt bewirkt, dass die Ausführung einen Fehler erzeugt und die folgende Fehlermeldung ausgelöst wird.

"Meldung 15247, Ebene 16, Status 1, Prozedur sp_changeobjectowner, Zeile 17

Der Benutzer besitzt nicht die Berechtigung zum Ausführen dieser Aktion."

sp_help

sp_help gibt ein Resultset für Funktionen zurück.

sp_help gibt zwei Resultsets für Funktionen zurück. Das zusätzliche Resultset ist für Funktionsparameter.

sysindexes

 

sys.sysindexes wird aus Gründen der Abwärtskompatibilität bereitgestellt. In SQL Server 2005 enthaltene Änderungen verhindern jedoch die vollständige Abwärtskompatibilität der Sicht mit früheren Versionen von SQL Server.

Systemmetadaten

Mitglieder der public-Rolle können Abfragen für Systemtabellen ausführen und Metadaten aus dem Katalog anzeigen.

Benutzer, die den Katalog abfragen, können nur Zeilen der Metadaten für Objekte anzeigen, die sie besitzen, oder wenn die Benutzer über bestimmte Berechtigungen für die Objekte verfügen. Dies gilt auch dann, wenn sie als Mitglied einer Rolle über die Berechtigung zum Anzeigen von Objekten verfügen. Weitere Informationen und empfohlene Korrekturaktionen finden Sie unter Konfigurieren der Sichtbarkeit von Metadaten und Behandlung von Problemen bei der Sichtbarkeit von Metadaten.

Systemtabellen

Systemtabellen weisen den Typ 'S' auf.

Systemtabellen sind als Kompatibilitätssichten verfügbar und weisen den Typ 'V' auf. Anweisungen, die Systemtabellen abfragen und den Suchkriterientyp = 'S' einschließen, schlagen fehl.

Ändern Sie den Suchkriterientyp der Anweisung in = 'V'.

Oder

Migrieren Sie zu den neuen Katalogsichten oder zu den dynamischen Verwaltungssichten. Weitere Informationen finden Sie unter Zuordnen von SQL Server 2000-Systemtabellen zu SQL Server 2005-Katalogsichten.

TABLOCK beim Massenimportieren mithilfe von bcp, BULK INSERT oder OPENROWSET(BULK...)

Beim Massenimportieren in eine Tabelle mit einem nicht leeren gruppierten Index wird der TABLOCK-Hinweis ignoriert.

Beim Massenimportieren in eine Tabelle mit einem nicht leeren gruppierten Index fordert der TABLOCK-Hinweis eine X-Sperre für die Tabelle an. Durch dieses Verhalten wird das parallele Massenimportieren von Daten verhindert. Wenn Sie in diesem Fall einen parallelen Massenimport ausführen möchten, sollten Sie TABLOCK nicht verwenden. Weitere Informationen zum parallelen Massenladen finden Sie unter Richtlinien zur Optimierung von Massenimport.

Trigger

Direkte Rekursion von Triggern tritt nur auf, wenn ein Trigger ausgelöst wird und eine Aktion ausführt, die das erneute Auslösen desselben Triggers verursacht.

Direkte Rekursion von Triggern tritt unter folgenden Umständen auf:

  • Ein Trigger wird ausgelöst und führt eine Aktion aus, die das erneute Auslösen desselben Triggers verursacht.
  • Derselbe Trigger wird erneut aufgerufen, jedoch nachdem ein Trigger eines anderen Typs (AFTER oder INSTEAD OF) aufgerufen wurde.

Indirekte Rekursion tritt auf, wenn ein Trigger ausgelöst wird und eine Aktion ausführt, die verursacht, dass ein anderer Trigger desselben Typs (AFTER oder INSTEAD OF) ausgelöst wird. Dieser zweite Trigger führt eine Aktion aus, die das erneute Auslösen des ursprünglichen Triggers bewirkt.

Weitere Informationen dazu finden Sie im Abschnitt zu rekursiven Triggern unter Verwenden von geschachtelten Triggern.

Trigger

Wen eine UPDATE- oder DELETE-Anweisung für eine partitionierte Sicht (lokal oder verteilt) ausgegeben wird, werden alle UPDATE- oder DELETE-Trigger ausgelöst, die in den Basistabellen der Sicht definiert sind. Dazu gehören Trigger in Tabellen, die nicht von dem Aktualisierungs- oder Löschvorgang betroffen sind.

Wenn eine UPDATE- oder DELETE-Anweisung für eine partitionierte Sicht ausgegeben wird, wird ein UPDATE- oder DELETE-Trigger nur dann ausgelöst, wenn die Basistabelle, in der der Trigger definiert ist, von dem Aktualisierungs- oder Löschvorgang betroffen ist. Weitere Informationen finden Sie unter Ausführen von DML-Triggern.

UPDATE()-Funktion

Die UPDATE()-Funktion erkennt keine Änderungen an timestamp-Spalten. Für diese Spalten gibt eine IF UPDATE()-Klausel innerhalb des Triggertextes den Wert FALSE zurück, unabhängig davon, ob die Spalten aktualisiert werden oder nicht.

Die UPDATE()-Funktion erkennt Änderungen an timestamp-Spalten. Für diese Spalten gibt eine IF UPDATE()-Klausel innerhalb des DML-Triggertextes den Wert TRUE zurück, wenn die Spalten aktualisiert werden.

Benutzerdefinierte Funktionen

Benutzerdefinierte Funktionen können keine nicht deterministischen internen Systemfunktionen einschließen.

Benutzerdefinierte Funktionen in Transact-SQL können die meisten nicht deterministischen internen Systemfunktionen einschließen. Eine vollständige Liste der zulässigen internen Funktionen finden Sie unter Erstellen von benutzerdefinierten Funktionen (Datenbankmodul).

varchar-, nvarchar- und varbinary-Datentypen

Eine leere Zeichenfolge oder ein binärer Wert, die bzw. der als Definition einer berechneten Tabellenspalte verwendet wird, erstellt eine Spalte des Typs varchar(0), nvarchar(0) oder varbinary(0).

Eine leere Zeichenfolge oder ein binärer Wert, die bzw. der als Definition einer berechneten Tabellenspalte verwendet wird, erstellt eine Spalte des Typs varchar(1), nvarchar(1) oder varbinary(1). Diese Änderung im Verhalten betrifft nur den Datentyp der berechneten Spalte, nicht jedoch den berechneten Wert.

Ändern Sie Anwendungen, die die Länge von Datentypen berechneter Spalten untersuchen, sodass eine Mindestlänge von 1 Byte für varchar- und varbinary-Spalten und 2 Byte für nvarchar-Spalten erwartet wird.

Zugriff auf virtuelle Tabellen

Gäste oder Mitglieder der public-Rolle können auf virtuelle Tabellen zugreifen.

Für den Zugriff auf eine virtuelle Tabelle, wie z. B. sysprocesses, sind die VIEW SERVER STATE- und SELECT-Berechtigungen erforderlich.

WITH CHECK OPTION auf Sichten

Einfüge- und Aktualisierungsvorgänge sind auf Sichten zulässig, die die WITH CHECK OPTION-Klausel angeben und die über Remotetabellen erstellt werden. Dies gilt selbst dann, wenn diese Vorgänge außerhalb des gültigen Bereichs der SELECT-Anweisung der Sicht liegen.

SQL Server 2005 unterstützt die WITH CHECK OPTION-Klausel bei Einfüge- und Aktualisierungsvorgängen für Sichten, die für Tabellen von Remotedatenquellen erstellt werden.

Wenn Einfüge- und Aktualisierungsvorgänge für über Remotetabellen erstellte Sichten aufgrund der WITH CHECK OPTION-Klausel fehlerhaft sind und Sie dieses Verhalten nicht wünschen, geben Sie die WITH CHECK OPTION-Klausel für die Sicht nicht an.

Weitere Informationen finden Sie unter CREATE VIEW (Transact-SQL), ALTER VIEW (Transact-SQL) und Ändern von Daten über eine Sicht.

xp_cmdshell

Wenn beim Ausführen von xp_cmdshell ein Fehler auftritt, wird eine Fehlermeldung ausgelöst. Die Ausführung wird jedoch nicht beendet.

Wenn beim Ausführen von xp_cmdshell ein Fehler auftritt, wird eine Fehlermeldung ausgelöst, und die Ausführung wird beendet.

Siehe auch

Verweis

Fehlerhafte Änderungen an Features des Datenbankmoduls in SQL Server 2005
Als veraltet markierte Features des Datenbankmoduls in SQL Server 2005
Nicht mehr unterstützte Datenbankmodul-Funktionalität in SQL Server 2005

Andere Ressourcen

Abwärtskompatibilität des SQL Server 2005-Datenbankmoduls
sp_dbcmptlevel (Transact-SQL)

Hilfe und Informationen

Informationsquellen für SQL Server 2005

Änderungsverlauf

Version Verlauf

17. Juli 2006

Neuer Inhalt:
  • Der Tabelle, in der die Transact-SQL-Verhaltensänderungen aufgeführt sind, wurde der Eintrag "Ausdrücke in berechneten Spalten, CHECK-Einschränkungen und DEFAULT-Einschränkungen" hinzugefügt.
  • In der Tabelle, in der Transact-SQL-Verhaltensänderungen in der Spalte "Verhalten von SQL Server 2005" aufgeführt sind, wurde die Anweisung für den Eintrag "varchar-, nvarchar- und varbinary-Datentypen" geändert. Der Datentyp einer berechneten Tabellenspalte wurde von nvarchar(2) in nvarchar(1) geändert.

05. Dezember 2005

Neuer Inhalt:
  • Informationen zu ungültigen Cursordeklarationen wurden hinzugefügt.
  • Der Abschnitt "Ändern der Standardsprache für das sa-Konto" wurde hinzugefügt.
  • Der Abschnitt "DBCC CHECKFILEGROUP" wurde hinzugefügt.
  • Ein Abschnitt zu TABLOCK beim Massenimportieren wurde hinzugefügt.
  • Ein Abschnitt zu Triggern wurde hinzugefügt.
Geänderter Inhalt:
  • Korrekturen im Abschnitt zu den Datentypen varchar, nvarchar und varbinary.