: Ben bu makalede sağlanan tablo tarafından büyük ölçüde yardımcı yetkili cevabı, bulduk inanıyoruz http://msdn.microsoft.com/en-us/library/ms178569.aspx . CREATE DATABASE gerçekten de ANSI SQL uyumlu bir izin iken, CREATE ANY DATABASE bir MSSQL tescilli sunucu iznidir. Ancak, ikisi aynı değildir. Aslında, ikisi arasında oldukça önemli bir ayrım var ve bunu deneyerek buldum.
Her ikisi de izindir, ancak CREATE DATABASE, yalnızca şu anda kullanılan veritabanının güvenlik içeriğine bakarken, CREATE ANY DATABASE, SQL Server'da oturum açma listesine bakabilir. Bu, bir ANSI SQL sunucusuna yönelik genel beklentinin, bazı ana sistem veritabanlarında izinlerin verildiği ve bu veritabanındaki kullanıcılara izin verildiği için uygulandığı görünmektedir. Ardından, yeni veritabanlarının varsayılan davranışı, hangi izinleri devralması gerektiğini görmek için ustaya danışmaktır. (SQL 101, biliyorum, ama burada gerçekten örneklenmiştir.)
Öyleyse, CREATE DATABASE'i verdiğinizde, aslında bu izni vermek için usta bir kullanıcı olmanız gerekir. Bunu denerseniz, çalışır (ana bilgisayarda bir kullanıcı oluşturun, veritabanına verin, sonra veritabanları yapabilirsiniz). Ancak, herhangi bir veritabanı oluşturma (veya dbcreator rolünü verme) vererek, ana alanda hazır bir kullanıcı olmanıza gerek yoktur.
İki izin arasındaki farkı daha fazla göstermek için, bir kullanıcıya master veya başka bir veritabanında CREATE DATABASE vererek geri dönen farklı mesajları gözlemleyin, ardından durulayın ve herhangi bir CREATE HER VERİTABANI için izin için tekrarlayın.
use master; GRANT CREATE DATABASE to TestUser
Mesaj 15151, Seviye 16, Durum 1, Satır 1 Kullanıcı 'TestUser' bulunamıyor, çünkü mevcut değil veya izniniz yok.
Bu hata, TestUser kullanıcısı henüz ana veritabanında olmadığı için olur. Bu, veritabanı düzeyinde bir izindir - seçilen veritabanının dışına çıkıp oturum açma veya kullanıcı aramaya yönelik bir bağlam yoktur. Önce kullanıcıyı master'da oluşturursanız, bu komutun başarılı olduğunu ve size herhangi bir CREATE AN DATABASE verilmiş gibi veritabanları oluşturabileceğinizi unutmayın.
use master; GRANT CREATE ANY DATABASE to TestUser
Komut (lar) başarıyla tamamlandı.
Bunun nedeni, tescilli bir Microsoft SQL Server izni olarak, CREATE ANY DATABASE'in yalnızca mevcut veritabanındaki kullanıcıları değil, SQL örneği için oturum açma listesine bakabilmesidir.
use test; GRANT CREATE DATABASE to TestUser
Mesaj 15151, Seviye 16, Durum 1, Satır 1 Kullanıcı 'TestUser' bulunamıyor, çünkü mevcut değil veya izniniz yok.
Bu, ilk örnek için açıklamamın tutarlılığını göstermektedir. Aşağıdaki sorguyu ve sonuç hata iletisini not alın. Kullanıcıyı ilk kez bu veritabanında oluşturursanız bu hata iletisini alamazsınız (son sorguyu görün).
use test; GRANT CREATE ANY DATABASE to TestUser
Mesaj 4621, Seviye 16, Durum 10, Satır 1 Sunucu kapsamındaki izinler, yalnızca geçerli veritabanı usta olduğunda verilebilir
İkinci sorguda gösterildiği gibi, HERHANGİ BİR VERİTABANI OLUŞTURMA, bu giriş adını zaten oluşturduğum girişler listesine danışıyor. Bu nedenle, SQL Server kullanıcının varlığını kabul ederken, hala hata veriyor, çünkü MSSQL'de izin verilmeyen master dışında bir yerde sunucu düzeyinde izin vermeye çalışıyorum.
use test; create user TestUser; grant create database to TestUser
CREATE DATABASE izni yalnızca ana veritabanında verilebilir. Mesaj 0, Seviye 11, Durum 0, Satır 0 Geçerli komutta ciddi bir hata oluştu. Varsa, sonuçlar atılmalıdır.
Şimdi başvurmak için CREATE DATABASE için bir kullanıcı olduğu için, SQL Server'ın bu izinleri depoladığı yer olduğundan, master dışında herhangi bir yerde sunucu düzeyinde izinler veremediğiniz genel hata iletisine sahibim.
Bu eğlenceliydi.