VERİTABANI OLUŞTURMA VE HERHANGİ BİR VERİTABANI izinleri oluşturun


21

Microsoft SQL Server'da CREATE DATABASEve CREATE ANY DATABASEizinler arasındaki fark nedir?

Yetkili bir cevap bulamıyorum. Çıkarım yapabileceğimin en iyisi (a) ' CREATE ANYnın başka bir kullanıcıya ait olacak veritabanını oluşturabileceğimi, oysa CREATEyapamayacağımı ya da (b) Sybase / erken SQL Server günlerinde orijinal izninin alındığı CREATE ANYve CREATEtakma olduğu. ANSI uygunluğu.


Echoing Aaron'ın söylediği, +1 ama düzenlemeyi gerçekten kesmelisin, cevap olarak yapıştır, sonra kabul et. İki neden: cevabın ne olduğunu açıklar (ve düzenlemeniz harika bir cevaptır) ve aynı zamanda daha düzenli (cevapsız sorular bazen daha fazla dikkat çekmek için üst sıralara çıkarılır).
Simon Righar

1
Tamam, ama yarına kadar kabul edemem ve dün hiç cevap yazamadım (<100 rep için kendi kendine cevap verme 5 saatlik limiti).
Tohuw

Yanıtlar:


21

: 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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.