it-swarm.asia

إنشاء قاعدة بيانات مقابل إنشاء أي أذونات قاعدة البيانات

في Microsoft SQL Server ، ما الفرق بين CREATE DATABASE و CREATE ANY DATABASE أذونات؟

لا يمكنني العثور على إجابة موثوقة. أفضل ما يمكنني استنتاجه هو إما (أ) CREATE ANY يعني أنه يمكنني إنشاء قاعدة بيانات ليصبح ملكًا لمستخدم آخر ، بينما مع CREATE لا أستطيع ، أو (ب) كان الإذن الأصلي في Sybase/أوائل SQL Server أيام CREATE ANY و CREATE مستعار لمطابقة ANSI.

22
Tohuw

أعتقد أنني وجدت الجواب الرسمي ، الذي ساعده إلى حد كبير الجدول الوارد في هذه المقالة: http://msdn.Microsoft.com/en-us/library/ms178569.aspx . يبدو أن CREATE DATABASE هو إذن متوافق مع ANSI SQL ، بينما CREATE ANY DATABASE هو إذن خادم MSSQL. ومع ذلك ، فإن الاثنين ليسا متشابهين. في الواقع ، هناك فرق مهم بين الاثنين ، وقد اكتشفت ذلك من خلال تجربته.

كلاهما أذونات ، ولكن CREATE DATABASE يستشير فقط سياق الأمان لقاعدة البيانات المستخدمة حاليًا ، بينما CREATE ANY DATABASE يمكن البحث عن قائمة تسجيلات الدخول على SQL Server. يبدو أن هذا قد تم تنفيذه لأن التوقع العام لخادم ANSI SQL هو منح الأذونات في بعض قواعد بيانات النظام الرئيسية ، مع منح المستخدمين في قاعدة البيانات هذه الأذونات. ثم السلوك الافتراضي لقواعد البيانات الجديدة هو استشارة الرئيسي لمعرفة الأذونات التي يجب أن ترثها. (SQL 101 ، أعلم ، ولكن هذا مثال هنا).

لذلك ، عندما تمنح CREATE DATABASE ، يجب أن يكون لديك مستخدم رئيسي لمنح هذا الإذن. إذا جربت ذلك ، فإنه يعمل (إنشاء مستخدم رئيسي ، ومنحه إنشاء قاعدة بيانات ، ثم يمكنك إنشاء قواعد بيانات). ومع ذلك ، من خلال منح إنشاء أي قاعدة بيانات (أو منح الدور dbcreator) ، لا تحتاج إلى أن تكون مستخدمًا حرفيًا في الماجستير.

لتوضيح الفرق بين الإذنين بشكل أكبر ، لاحظ الرسائل المختلفة التي تم إرجاعها عن طريق منح مستخدم إنشاء قاعدة بيانات على قاعدة بيانات رئيسية مقابل قاعدة بيانات أخرى ، ثم شطفها وتكرارها للحصول على إذن إنشاء أي قاعدة بيانات.

use master; GRANT CREATE DATABASE to TestUser

رسالة 15151 ، المستوى 16 ، الحالة 1 ، السطر 1 لا يمكن العثور على المستخدم "TestUser" ، لأنه غير موجود أو أنك لا تملك الإذن.

يحدث هذا الخطأ لأن المستخدم TestUser ليس بعد في قاعدة البيانات الرئيسية. هذا إذن على مستوى قاعدة البيانات - ليس لديه سياق للذهاب خارج قاعدة البيانات المحددة والبحث عن تسجيلات الدخول أو المستخدمين. لاحظ أنه إذا قمت بإنشاء المستخدم بشكل رئيسي أولاً ، فإن هذا الأمر ينجح ، ويمكنك إنشاء قواعد بيانات كما لو تم منحك إنشاء أي قاعدة بيانات.

use master; GRANT CREATE ANY DATABASE to TestUser

اكتمل الأمر (الأوامر) بنجاح.

ينجح هذا لأنه ، كإذن ملكية لـ Microsoft SQL Server ، يمكن إنشاء أي قاعدة بيانات مراجعة قائمة تسجيلات الدخول لمثيل SQL ، وليس فقط المستخدمين في قاعدة البيانات المستخدمة حاليًا.

use test; GRANT CREATE DATABASE to TestUser

رسالة 15151 ، المستوى 16 ، الحالة 1 ، السطر 1 لا يمكن العثور على المستخدم "TestUser" ، لأنه غير موجود أو أنك لا تملك الإذن.

هذا يوضح اتساق شرحي للمثال الأول. لاحظ الاستعلام أدناه ورسالة الخطأ الناتجة. لن تتلقى رسالة الخطأ هذه إذا قمت أولاً بإنشاء المستخدم في قاعدة البيانات هذه (انظر الاستعلام الأخير).

use test; GRANT CREATE ANY DATABASE to TestUser

لا يمكن منح أذونات Msg 4621 و Level 16 و State 10 و Line 1 على نطاق الخادم إلا عندما تكون قاعدة البيانات الحالية رئيسية

كما هو موضح في الاستعلام الثاني ، يقوم CREATE ANY DATABASE باستشارة قائمة تسجيلات الدخول ، حيث قمت بالفعل بإنشاء اسم تسجيل الدخول هذا. لذا ، بينما أقر SQL Server بوجود المستخدم ، فإنه لا يزال يخطئ لأنني أحاول منح إذن على مستوى الخادم في مكان آخر غير الرئيسي ، وهو أمر غير مسموح به في MSSQL.

use test; create user TestUser; grant create database to TestUser

لا يمكن منح إذن إنشاء قاعدة بيانات إلا في قاعدة البيانات الرئيسية. Msg 0، Level 11، State 0، Line 0 حدث خطأ فادح في الأمر الحالي. النتائج، إن وجدت، وينبغي التخلص منها.

الآن بما أن هناك مستخدمًا لتطبيق CREATE DATABASE للتقدم إليه ، فقد تلقيت رسالة خطأ عامة تفيد بأنه لا يمكنك منح أذونات على مستوى الخادم في أي مكان غير الرئيسية ، لأن هذا هو المكان الذي يخزن فيه SQL Server هذه الأذونات

حسنًا ، كان هذا ممتعًا.

22
Tohuw