it-swarm-eu.dev

VYTVOŘIT DATABÁZE vs. VYTVOŘIT JAKÉKOLI DATABÁZOVÉ oprávnění

V Microsoft SQL Server, jaký je rozdíl mezi CREATE DATABASE a CREATE ANY DATABASE oprávnění?

Nedokážu najít autoritativní odpověď. Nejlepší z toho mohu usoudit, že buď (a) CREATE ANY znamená, že mohu vytvořit databázi, kterou bude vlastnit jiný uživatel, zatímco s CREATE nemůžu, nebo (b) původní oprávnění v Sybase/časných dnech serveru SQL bylo CREATE ANY a CREATE je pojmenováno pro ANSI shodu.

22
Tohuw

Věřím, že jsem našel autoritativní odpověď, která mi velmi pomohla tabulka uvedená v tomto článku: http://msdn.Microsoft.com/en-us/library/ms178569.aspx . Vypadá to, že CREATE DATABASE je skutečně oprávnění kompatibilní s ANSI SQL, zatímco CREATE ANY DATABASE je povolení serveru MSSQL. Tyto dva však nejsou stejné. Ve skutečnosti mezi nimi existuje poměrně důležitý rozdíl a já jsem to zjistil vyzkoušením.

Oba jsou oprávnění, ale CREATE DATABASE konzultuje pouze kontext zabezpečení aktuálně používané databáze, zatímco CREATE ANY DATABASE může vyhledat seznam přihlášení na serveru SQL. Toto se zdá být implementováno, protože obecným očekáváním pro server ANSI SQL je, že oprávnění jsou udělována v některé hlavní systémové databázi, přičemž uživatelům v této databázi byla udělena oprávnění. Výchozí chování nových databází je pak konzultovat master, aby zjistili, jaká oprávnění by měla zdědit. (SQL 101, vím, ale je to zde opravdu doloženo.)

Když tedy udělíte CREATE DATABASE, musíte ve skutečnosti mít uživatele master, aby toto oprávnění udělil. Pokud to zkusíte, bude to fungovat (vytvořit uživatele v masteru, udělit mu vytvořit databázi, pak si můžete vytvořit databáze). Poskytnutím vytvoření jakékoli databáze (nebo přidělením role dbcreator) však nemusíte být doslovným uživatelem v masteru.

Chcete-li dále ilustrovat rozdíl mezi oběma oprávněními, sledujte rozdílné zprávy vrácené udělením uživatele CREATE DATABASE na master vs. jiná databáze, poté opláchněte a opakujte oprávnění CREATE ANY DATABASE.

use master; GRANT CREATE DATABASE to TestUser

Msg 15151, úroveň 16, stav 1, řádek 1 Nelze najít uživatele 'TestUser', protože neexistuje nebo nemáte oprávnění.

K této chybě dochází, protože uživatel TestUser ještě není v hlavní databázi. Toto je oprávnění na úrovni databáze - nemá kontext jít mimo vybranou databázi a hledat přihlášení nebo uživatele. Všimněte si, že pokud nejprve vytvoříte uživatele v hlavním počítači, bude tento příkaz úspěšný a můžete vytvářet databáze, jako by vám bylo uděleno CREATE ANY DATABASE.

use master; GRANT CREATE ANY DATABASE to TestUser

Příkazy byly úspěšně dokončeny.

Toto uspěje, protože jako chráněné oprávnění Microsoft SQL Server může CREATE ANY DATABASE nahlédnout do seznamu přihlášení pro instanci SQL, nejen pro uživatele v aktuálně používané databázi.

use test; GRANT CREATE DATABASE to TestUser

Msg 15151, úroveň 16, stav 1, řádek 1 Nelze najít uživatele 'TestUser', protože neexistuje nebo nemáte oprávnění.

Toto ukazuje konzistenci mého vysvětlení pro první příklad. Poznamenejte si dotaz níže a jeho výslednou chybovou zprávu. Tato chybová zpráva se nezobrazí, pokud nejprve vytvoříte uživatele v této databázi (viz poslední dotaz).

use test; GRANT CREATE ANY DATABASE to TestUser

Msg 4621, úroveň 16, stav 10, řádek 1 Oprávnění v rozsahu serveru lze udělit pouze tehdy, když je aktuální databáze hlavní

Jak je uvedeno ve druhém dotazu, CREATE ANY DATABASE konzultuje seznam přihlášení, kde jsem již vytvořil toto přihlašovací jméno. Takže i když SQL Server uznal existenci uživatele, stále chybuje, protože se pokouším udělit oprávnění na úrovni serveru někde jinému než hlavní, což není v MSSQL povoleno.

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

Oprávnění CREATE DATABASE lze udělit pouze v hlavní databázi. Msg 0, úroveň 11, stav 0, řádek 0 Při aktuálním příkazu došlo k závažné chybě. Výsledky, pokud existují, by měly být zahozeny.

Nyní, když existuje uživatel pro CREATE DATABASE, na který se vztahuje, dostávám obecnou chybovou zprávu, kterou nemůžete udělit oprávnění na úrovni serveru nikde kromě hlavního serveru, protože to je místo, kde SQL Server tato oprávnění ukládá .

To byla zábava.

22
Tohuw