Kategorie szkoleń | Egzaminy | Kontakt
  • 2
  • 16
  • 361

Załóżmy, że nasza baza ma ustawione collation typu case sensitive np. Polish_CS_AS. Mamy w bazie dwie tabele, których nazwy różnią się wielkością liter np. Tabela i tabela. Jak zachowa się serwer SQL, gdy zmienimy takiej bazie collation na case insensitive np. Polish_CI_AS?

 

Maciej_Krauze
  • Zapytał
  • @ Maciej_Krauze | 24.10.2014
    • lider
    • laureat
    • 45
    • 16
    • 58

Odpowiedzi (2)

  • 0

Jako że miałem chwilę czasu, a temat nie dawał mi spokoju, zrobiłem mały test:

 

CREATE DATABASE baza1 COLLATE POLISH_CS_AS;
GO

USE baza1;
GO

CREATE TABLE tabela( id INT, imie VARCHAR(20), nazwisko VARCHAR(20));
GO

CREATE TABLE Tabela( id INT, imie VARCHAR(20), nazwisko VARCHAR(20));
GO

ALTER DATABASE baza1 COLLATE POLISH_CI_AS;
GO

 

Odpowiedź serwera była następująca:

Msg 1505, Level 16, State 1, Line 2

The CREATE UNIQUE INDEX statement terminated because a duplicate key was found for the object name 'dbo.sysschojobs' and the index name 'nc1'. The duplicate key value is (0,1, Tabela).

Msg 5072, Level 16, State 1, Line 2

ALTER DATABASE failed. The default collation of database 'baza1' cannot be set to Polish_CI_AS.

 

Komunikat nie zależy od zawartości tabel i wygląda jakby została podjęta próba połączenia tabel razem. Co właściwie próbował zrobić serwer?

 

 

 

CREATEDATABASEbaza1COLLATEPOLISH_CS_AS;GOUSEbaza1;GOCREATETABLEtabela(idINT,imieVARCHAR(20),nazwiskoVARCHAR(20));GOCREATETABLETabela(idINT,imieVARCHAR(20),nazwiskoVARCHAR(20));GOALTERDATABASEbaza1COLLATEPOLISH_CI_AS;GO
Maciej_Krauze
  • Odpowiedział
  • @ Maciej_Krauze | 28.10.2014
    • lider
    • laureat
    • 45
    • 16
    • 58
  • 7

Serwer próbował zrobić to, o co go poprosiliśmy, czyli zmienić sposób porównywania (sortowania) znaków. Operacja wymagała użycia tempdb, a błąd sugeruje, że podczas tworzenia indeksu nieklastrowego nc1 został wykryty duplikat w nazwie wchodzącej w skład klucza (Tabela). Biorąc pod uwagę, że wcześniej w indeksie pojawiła się nazwa tabela (z małej litery), a sposób porównywania znaków został ustawiony na CI (nieczuły na wielkość znaków), zachowanie jest oczekiwane.

Dla jasności, SQL nie próbował połączyć tabel, tylko błąd wynika z tworzenia indeksu na katalogu bazy danych zawierającym unikatowy indeks z nazwą obiektu - w tym przypadku tabeli.

  • Odpowiedział
  • @ | 30.10.2014
  • TRENER ALTKOM AKADEMII
Komentarze
Faktycznie, o tempdb nie pomyślałem. Dziękuję za wyjaśnienie.
Skomentował : @ Maciej_Krauze ,31.10.2014
  • 45
  • 16
  • 58