UTWÓRZ BAZA DANYCH a UTWÓRZ DOWOLNE uprawnienia

21

W Microsoft SQL Server, jaka jest różnica między uprawnieniami CREATE DATABASEa CREATE ANY DATABASE?

Nie mogę znaleźć wiarygodnej odpowiedzi. Najlepsze, co mogę wywnioskować, to to, że albo (a) CREATE ANYoznacza, że ​​mogę utworzyć bazę danych, która będzie własnością innego użytkownika, podczas gdy CREATEnie mogę, lub (b) pierwotne pozwolenie w dniach Sybase / wczesnego SQL Server było CREATE ANYi CREATEjest aliasowane dla Zgodność z ANSI.

Tohuw
źródło
Powtarzając to, co powiedział Aaron, +1, ale naprawdę powinieneś wyciąć edycję, wkleić ją jako odpowiedź, a następnie zaakceptować. Dwa powody: wyjaśnia, jaka jest odpowiedź (a twoja edycja jest świetną odpowiedzią), a także jest ładniejsza (pytania, na które nie udzielono odpowiedzi, czasami trafiają na górę, aby uzyskać więcej uwagi).
Simon Righarts
1
Zrobione, ale nie mogę tego zaakceptować do jutra, a wczoraj nie mogłem w ogóle publikować żadnych odpowiedzi (5-godzinny limit samo-odpowiedzi dla <100 powtórzeń).
Tohuw

Odpowiedzi:

21

Wydaje mi się, że znalazłem autorytatywną odpowiedź, bardzo pomocną w tabeli podanej w tym artykule: http://msdn.microsoft.com/en-us/library/ms178569.aspx . Wydaje się, że CREATE DATABASE jest rzeczywiście zgodnym z ANSI SQL uprawnieniem, podczas gdy CREATE ANY DATABASE jest zastrzeżonym prawem do serwera MSSQL. Jednak dwa nie są takie same. W rzeczywistości istnieje dość ważna różnica między nimi, a ja to odkryłem, próbując tego.

Oba są uprawnieniami, ale CREATE DATABASE sprawdza jedynie kontekst bezpieczeństwa aktualnie używanej bazy danych, podczas gdy CREATE ANY DATABASE może wyszukać listę loginów na serwerze SQL. Wydaje się, że zostało to zaimplementowane, ponieważ ogólne oczekiwanie na serwer ANSI SQL jest takie, że uprawnienia są przyznawane w głównej bazie danych systemu, a użytkownicy w tej bazie danych mają uprawnienia. Następnie domyślnym zachowaniem nowych baz danych jest skonsultowanie się z masterem, aby zobaczyć, jakie uprawnienia powinien odziedziczyć. (SQL 101, wiem, ale tutaj jest naprawdę przykładem).

Tak więc, kiedy udzielisz CREATE DATABASE, musisz mieć użytkownika nadrzędnego, aby udzielić tego uprawnienia. Jeśli spróbujesz tego, to zadziała (utwórz użytkownika w systemie głównym, utwórz go, utwórz bazę danych). Jednakże, przyznając utworzenie dowolnej bazy danych (lub przyznając rolę dbcreator), nie musisz być dosłownym użytkownikiem w systemie głównym.

Aby dodatkowo zilustrować różnicę między tymi dwoma uprawnieniami, obserwuj różne komunikaty zwracane przez udzielenie użytkownikowi UTWÓRZ BAZY DANYCH w bazie danych w porównaniu z inną bazą danych, a następnie spłucz i powtórz dla uzyskania pozwolenia UTWÓRZ DOWOLNĄ BAZĘ DANYCH.

use master; GRANT CREATE DATABASE to TestUser

Msg 15151, poziom 16, stan 1, wiersz 1 Nie można znaleźć użytkownika „TestUser”, ponieważ nie istnieje lub nie masz uprawnień.

Ten błąd występuje, ponieważ użytkownik TestUser nie znajduje się jeszcze w głównej bazie danych. Jest to uprawnienie na poziomie bazy danych - nie ma kontekstu, aby wyjść poza wybraną bazę danych i poszukać danych logowania lub użytkowników. Zauważ, że jeśli najpierw utworzysz użytkownika w trybie głównym, to polecenie się powiedzie i możesz utworzyć bazy danych tak, jakbyś utworzył TWOJĄ DOWOLNĄ BAZĘ DANYCH.

use master; GRANT CREATE ANY DATABASE to TestUser

Polecenia zostały wykonane pomyślnie.

Udaje się to, ponieważ jako zastrzeżone uprawnienia Microsoft SQL Server, UTWÓRZ DOWOLNĄ BAZĘ DANYCH może przeglądać listę loginów instancji SQL, a nie tylko użytkowników w aktualnie używanej bazie danych.

use test; GRANT CREATE DATABASE to TestUser

Msg 15151, poziom 16, stan 1, wiersz 1 Nie można znaleźć użytkownika „TestUser”, ponieważ nie istnieje lub nie masz uprawnień.

To pokazuje spójność mojego wyjaśnienia dla pierwszego przykładu. Zwróć uwagę na poniższe zapytanie i wynikowy komunikat o błędzie. Ten komunikat o błędzie nie zostanie wyświetlony, jeśli najpierw utworzysz użytkownika w tej bazie danych (patrz ostatnie zapytanie).

use test; GRANT CREATE ANY DATABASE to TestUser

Msg 4621, poziom 16, stan 10, wiersz 1 Uprawnienia w zakresie serwera można przyznać tylko wtedy, gdy bieżąca baza danych jest nadrzędna

Jak pokazano w drugim zapytaniu, UTWÓRZ DOWOLNĄ BAZĘ DANYCH sprawdza listę logowań, na której już utworzyłem tę nazwę logowania. Tak więc, chociaż SQL Server potwierdził istnienie użytkownika, nadal występuje błąd, ponieważ próbuję przyznać uprawnienia na poziomie serwera w innym miejscu niż master, co nie jest dozwolone w MSSQL.

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

Uprawnienie CREATE DATABASE można przyznać tylko w głównej bazie danych. Wiadomość 0, poziom 11, stan 0, wiersz 0 Wystąpił poważny błąd w bieżącym poleceniu. Ewentualne wyniki należy odrzucić.

Teraz, gdy istnieje użytkownik, do którego można zastosować aplikację CREATE DATABASE, otrzymuję ogólny komunikat o błędzie, że nie można nadać uprawnień na poziomie serwera nigdzie poza urządzeniem głównym, ponieważ to tutaj SQL Server przechowuje te uprawnienia.

To była dobra zabawa.

Tohuw
źródło