SQL Server Msg 1934: QUOTED_IDENTIFIER hatası neden çıkar ve nasıl düzeltilir
SQL Server'da Msg 1934 hatası, filtered index gibi belirli özellikleri kullanan bir ifadeyi yanlış oturum ayarlarıyla çalıştırdığınızda çıkar. Yazar bu hatanın neden ASP.NET Core uygulamasında görülmediğini, sqlcmd'de ise görüldüğünü açıklıyor. Identity tablolarını elle güncelleyen herkesin karşılaşabileceği bir durum.
Kilit noktalar
- Msg 1934, bir ifadenin filtered index, indexed view, computed column index, XML metodu veya spatial index gibi özelliklerini kullanırken oturum ayarının yanlış olmasından kaynaklanır.
- Hızlı düzeltme: betiğin başına SET QUOTED_IDENTIFIER ON yazın ya da klasik sqlcmd'de -I anahtarını kullanın.
- Go tabanlı yeni sqlcmd her zaman QUOTED_IDENTIFIER açık çalışır, bu yüzden -I anahtarı orada etkisizdir.
- Saklı yordam, tetikleyici ve fonksiyonlar oluşturuldukları andaki ayarları saklar; SET komutu gövde içinde işe yaramaz.
- sys.sql_modules içinde uses_quoted_identifier = 0 olan modülleri bulup açık ayarlı bir oturumdan yeniden oluşturun.
- ASP.NET Core Identity'nin unique index'lerini silmeyin; kullanıcı adı tekilliğini bu index sağlar.
SQL Server Msg 1934, bir ifadenin dokunduğu özelliğin gerektirdiği oturum ayarının yanlış olduğunu bildirir. Yazarın örneğinde ASP.NET Core Identity'nin AspNetUsers tablosundaki filtered unique index, sqlcmd oturumunda QUOTED_IDENTIFIER kapalıyken UPDATE işlemini engelledi. Uygulamanın kullandığı ADO.NET, Entity Framework Core ve SSMS bu ayarı açık başlatır, bu yüzden hata uygulamada görülmez.
Çözüm, betiğin başında SET QUOTED_IDENTIFIER ON komutunu çalıştırmak ya da klasik sqlcmd için -I anahtarını kullanmaktır. Saklı yordamlar oluşturulduğu andaki ayarları sakladığından, içeride yapılan SET etkisizdir; bu durumda yordamı açık ayarla yeniden oluşturmak gerekir. Yazar, sys.sql_modules üzerinden bu ayarla kaydedilmiş modülleri bulmanın bir yolunu da gösteriyor.
Gerçek dünyada kullanımı
- Identity tablolarını doğrudan SQL ile düzelten bir bakım betiği, örneğin bozuk profil resmi yolunu güncelleyen bir UPDATE.
- Dağıtım sırasında SQL dosyalarını klasik sqlcmd ile çalıştıran bir deploy pipeline'ı.
- Eski bir SQL Server projesinde saklı yordamları yeniden oluşturup ayarları standartlaştırma çalışması.
Neden önemli
Uygulamanız hatasız çalışsa bile komut satırından yapılan veri düzeltmeleri ve dağıtım betikleri bu hatayla durabilir. Betiklerinize QUOTED_IDENTIFIER ayarını açıkça yazmak ve saklı yordamları doğru ayarla yeniden oluşturmak bu sorunu baştan önler.