none
IDENTIFIER_CASE von Senitiv auf mixed ändern RRS feed

  • 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

    Montag, 30. Januar 2012 07:36

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.

    Dienstag, 31. Januar 2012 17:42
  • 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

    Dienstag, 31. Januar 2012 18:24
    Beantworter

Alle Antworten

  • Hi,

    du kannst die Spracheinstellung bzw. Sortiereinstellung der Datenbank wieder auf Casi Insensitive stellen.

    ALTER DATABASE [Datenbankname] COLLATE SQL_Latin1_General_CP1_CI_AS
    

    Damit sollte es wieder funktionieren.

    Grüße

    Oliver

    Montag, 30. Januar 2012 07:43
  • 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 Serversortierung

    Danach 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

    Montag, 30. Januar 2012 08:28
    Beantworter
  • 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 !

     

    Montag, 30. Januar 2012 10:46
  • 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

    Montag, 30. Januar 2012 13:12
    Beantworter
  • 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....

    Dienstag, 31. Januar 2012 07:19
  • 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

    Dienstag, 31. Januar 2012 08:47
    Beantworter
  • 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.

    Dienstag, 31. Januar 2012 17:42
  • 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

    Dienstag, 31. Januar 2012 18:24
    Beantworter