Benutzer mit den meisten Antworten
IDENTIFIER_CASE von Senitiv auf mixed ändern

Frage
-
Hallo
ich habe eine Datenbank (Collation: SQL_Latin1_General_CP1_CI_AS) die auf einem SQL Server (SQL 2008 R2) meines Kunden (Server Collation: Latin1_General_CS_AS) installiert ist. Auf diesem Server ist der IDENTIFIER_CASE auf Sensitive eingestellt. Ich habe das mit
EXEC
master.dbo.sp_server_info 16
rausgefunden.
Das hat den unschönen Nebeneffekt das meine Serverobjekte und auch die Spaltennamen meiner Tabellen nun case sensitive vom Server interpretiert werden was mir gerade maximale Probleme macht.
Wie kann ich den IDENTIFIER_CASE auf mixed umstellen, denn damit funktioniert das einwandfrei ?Danke für jede Antwort
Antworten
-
Hallo Elmar,
die Sache wird langsam klar.
Wenn der Datenbankserver mit einer Case Insensitive Collation aufgesetzt wurde, dann werden die Spaltenamen auch case insensitiv behandelt, wurde der DB-Server dagegen case Sensitiv aufgesetzt dann werden auch die Spaltennamen case sensitiv behandelt.
Wenn man sich da mal die Prozedure sp_server_info vom quelltext anschaut wird das sonnenklar, das hat auch nix mit dem ODBC Treiber zu tun sondern läuft voll auf dem sql server ab.
Die Servercollatation lässt sich soweit ich weiss nicht einfach so umstellen oder gibt es da eine Möglichkeit ?
Für eine Datenbak kann man das wohl mit Alter Database machen (sowie ich gegooglet habe) aber gibt es da auch was fuer die Collation des SQL Server oder muss da der Server neu aufgesetzt werden ?
Wenn ich mir das hier anschaue
http://msdn.microsoft.com/de-de/library/ms179254.aspx
dann ist es wohl besser den Server neu aufzusetzen.
- Als Antwort markiert Jörg Tiedemann Donnerstag, 2. Februar 2012 18:19
-
Hallo Jörg,
Zum Ändern der Serversortierung musst Du den Server neu aufsetzen, wie bereits in der ersten Antwort geschrieben.
ALTER DATABASE ändert nur die Datenbank-Einstellungen.
Bereits bestehende Objekte (Tabellen usw.-) werden dadurch nicht geändert,
dazu muss man die Daten entladen, die Tabellen mit geänderter Sortierung neu erstellen
und die Daten wieder laden - was für alle Benutzerdatenbanken passieren muss.Wobei es beim Wechsel auf case-insensitiv u. U. doppelte Schlüssel geben kann.
Wenn Deine Datenbank aus einem Backup wiederhergestellt wurde, so bleiben die Einstellungen erhalten.
Gruß Elmar
- Als Antwort markiert Jörg Tiedemann Donnerstag, 2. Februar 2012 18:20
Alle Antworten
-
Hallo Jörg,
die Sortierung von Bezeichnern hängt davon ab, wo sie definiert wurden: Sortierung des Bezeichners
Das Ändern der Server Sortierung geht nur über das Setup, da es auch die Systemdatenbanken betrifft:
Festlegen und Ändern der ServersortierungDanach sind aber alle anderen Datenbanken auf dem Server (nicht nur Deine) davon betroffen,
so dass dies sorgfältig überlegt werden sollte, vom möglichen Zeitaufwand mal abgesehen.Evtl. günstiger kann es sein, eine weitere SQL Server Instanz zu installieren.
Gruß Elmar
-
Hallo Elmar
damit ich da nicht falsch verstanden werde. Die Sortierung meiner Datenbank ist case insensitiv und das ist auch richtig so. Der Datenbankserver hat eine collation die case sensitiv ist.
Mein Problem ist das ich die Eigenschaft IDENTIFIER_CASE auf mixed einstellen will.
Der von Dir angegebenen Doku nach:
"Bezeichnern von Objekten innerhalb einer Datenbank, wie z. B. Tabellen, Sichten und Spaltennamen, wird die Standardsortierung der Datenbank zugewiesen"
müsste dann doch alles ok und demnach case insensitiv sein ?
Die Frage ist eigentlich kann ich die Eigenschaft IDENTIFIER_CASE auf mixed einstellen oder nicht oder wie kann ich es ansonsten hinbekommen, das beim einem "Select Spaltenname von Tabelle" der Spaltenname vom Server case insensitiv behandelt wird ? Meine Datenbank collation ist doch case insensitiv !
-
Hallo Jörg,
etwas wie "Mixed" gibt es nicht, der SQL Server unterscheidet dort nach Sortierungen:
Rangfolge von Sortierungen (Transact-SQL) und Bezeichner erhalten keine Sonderbehandlung.Und die Systemtabellen/-sichten übernehmen die Einstellung bei der Erstellung der Datenbank,
siehe z. B. die Ausgabe von sp_help 'sys.tables' (und dort die Collation Spalte).
(und nachträgliche Änderungen betreffen keine bestehenden Objekte).Es sind aber nicht nur die Objektnamen, die Probleme bereiten, aber auch temporäre Tabellen usw.
z. B. http://www.sqlskills.com/blogs/Kimberly/post/Changing-Database-Collation-and-dealing-with-TempDB-Objects.aspx
Verallgemeinert:
Wenn Du Deine Datenbank nicht für case-insensitiv entwickelt hast, wirst Du immer wieder Probleme bekommen.
Und wenn Du den Server nicht für Dich alleine hast, so ist der Weg eine eigene Instanz zu erstellen
meist der schnellere und schmerzlosere.
Denn ein Umstellen bedeutet vollständiges Entladen aller anderen Datenbanken.
Und kann wieder das Verhalten der anderen Anwendungen beeinträchtigen.Und ist vergleichbar, wenn Du von einer Sprache wie Visual Basic auf C# (oder einem anderen C) wechselt.
Nur dass sich dort bereits der Compiler beschwert. T-SQL kompiliert aber nur auf Anforderung,
so dass es dort noch mühseliger ist, Fehler zu finden. Deswegen:
Eine Case-sensitive Anwendung sollte man von Anfang an auf einer case-sensitiven SQL Server Instanz entwickeln.Gruß Elmar
-
Hallo Elmar
"etwas wie "Mixed" gibt es nicht, "
Natürlich gibt es so etwas, mein SQL Server liefert mir doch genau das wenn ich die stored procedure
EXEC master.dbo.sp_server_info 16
aufrufe bekomme ich auf meinem SQL Server als attribute value den Wert "mixed" für das attribut IDENTIFIER_CASE und beim Kundensystem halt den attribute value "sensitiv"
Meine Datenbank wurde auf meinem SQL Server erzeugt und zwar als case-insensitiv und dort funktioniert auch alles. Die Datenbank wurde dann bei Auslieferung auf dem Kundensystem per DB restore zurückgesichert und dort hat der Server die collation case sensitiv.
Liegt das nun daran ? Meine Datenbank wurde bei der Erzeugung auf jedenfall case-insensitiv erzeugt.
Ich versteh nur nicht wieso ich den IDENTIFIER_CASE nicht umstellen kann bzw. warum meine Datenbank dann auf dem Kundensystem case sensitiv bzgl. der Spaltennamen reagiert aber bzgl. der Datenbankinhalte weiterhin case-insensitiv ist.
Wie krieg ich die verdammte Daténbank nur dazu so zu reagieren wie ich sie auf meinem System designed habe, was ich dabei auch überhaupt nicht verstehe ist das das casesensitive Verhalten nur bei den Spaltennamen auftritt aber nicht bei den Inhalten der Tabelle.
Verwirr, Verwirr....
-
Hallo Jörg,
sp_server_info ist Teil von ODBC und gibt keine detaillierte Auskunft,
sondern nur, was in einem (sehr alten) Standard mal festgelegt wurde,
als u. a. Zeichensätze wie Unicode noch weit entfernt von der Realität waren
und ebenso gemischte Zeichensätze in Datenbanken.Und wird vom ODBC Treiber erzeugt, der die Information erstellt anhand von:
if 'A' = 'a' /* If not case sensitive server */ begin insert into spt_server_info values (16,'IDENTIFIER_CASE','MIXED') end else begin insert into spt_server_info values (16,'IDENTIFIER_CASE','SENSITIVE') end
(aus einer INSTCAST.SQL für SQL Server 2000 entnommen).Was verdeutlichen sollte, dass die Information nutzlos ist.
Ich empfehle Dir die Links von gestern intensiver durchzulesen.
Für die Datenbankinhalte gilt die festgelegte Sortierung für die Spalte,
die sich wiederum im Standard aus der Datenbanksortierung ergibt,
siehe COLLATE (database_default)Zum Schluss: Du wirst dabei auch mit Fluchen nichts erzwingen können.
Wie heißt es so schön: Computer haben immer Recht ;-)Gruß Elmar
-
Hallo Elmar,
die Sache wird langsam klar.
Wenn der Datenbankserver mit einer Case Insensitive Collation aufgesetzt wurde, dann werden die Spaltenamen auch case insensitiv behandelt, wurde der DB-Server dagegen case Sensitiv aufgesetzt dann werden auch die Spaltennamen case sensitiv behandelt.
Wenn man sich da mal die Prozedure sp_server_info vom quelltext anschaut wird das sonnenklar, das hat auch nix mit dem ODBC Treiber zu tun sondern läuft voll auf dem sql server ab.
Die Servercollatation lässt sich soweit ich weiss nicht einfach so umstellen oder gibt es da eine Möglichkeit ?
Für eine Datenbak kann man das wohl mit Alter Database machen (sowie ich gegooglet habe) aber gibt es da auch was fuer die Collation des SQL Server oder muss da der Server neu aufgesetzt werden ?
Wenn ich mir das hier anschaue
http://msdn.microsoft.com/de-de/library/ms179254.aspx
dann ist es wohl besser den Server neu aufzusetzen.
- Als Antwort markiert Jörg Tiedemann Donnerstag, 2. Februar 2012 18:19
-
Hallo Jörg,
Zum Ändern der Serversortierung musst Du den Server neu aufsetzen, wie bereits in der ersten Antwort geschrieben.
ALTER DATABASE ändert nur die Datenbank-Einstellungen.
Bereits bestehende Objekte (Tabellen usw.-) werden dadurch nicht geändert,
dazu muss man die Daten entladen, die Tabellen mit geänderter Sortierung neu erstellen
und die Daten wieder laden - was für alle Benutzerdatenbanken passieren muss.Wobei es beim Wechsel auf case-insensitiv u. U. doppelte Schlüssel geben kann.
Wenn Deine Datenbank aus einem Backup wiederhergestellt wurde, so bleiben die Einstellungen erhalten.
Gruß Elmar
- Als Antwort markiert Jörg Tiedemann Donnerstag, 2. Februar 2012 18:20