Permissões CREATE DATABASE vs. CREATE ANY DATABASE

21

No Microsoft SQL Server, qual é a diferença entre as permissões CREATE DATABASEe CREATE ANY DATABASE?

Não consigo encontrar uma resposta autorizada. O melhor que posso deduzir é que (a) CREATE ANYimplica que eu posso criar o banco de dados para pertencer a outro usuário, enquanto CREATEque não posso, ou (b) a permissão original nos dias do Sybase / SQL Server inicial era CREATE ANYe CREATEé alias para Conformidade com ANSI.

Tohuw
fonte
Ecoando o que Aaron disse, +1, mas você realmente deve cortar a edição, colá-la como resposta e aceitá-la. Duas razões: esclarece qual é a resposta (e sua edição é uma ótima resposta) e também é mais organizada (perguntas sem resposta às vezes são levadas ao topo para obter mais atenção).
Simon Righarts
1
Concluído, mas não posso aceitá-lo até amanhã, e não pude postar nenhuma resposta ontem (limite de 5 horas para responder automaticamente por <100 repetições).
Tohuw

Respostas:

21

Acredito ter encontrado a resposta autorizada, ajudada bastante pela tabela fornecida neste artigo: http://msdn.microsoft.com/en-us/library/ms178569.aspx . Parece que CREATE DATABASE é de fato a permissão compatível com ANSI SQL, enquanto CREATE ANY DATABASE é uma permissão de servidor proprietário do MSSQL. No entanto, os dois não são os mesmos. De fato, há uma distinção bastante importante entre os dois, e eu descobri isso tentando.

Ambas são permissões, mas CREATE DATABASE somente consulta o contexto de segurança do banco de dados usado atualmente, enquanto CREATE ANY DATABASE pode procurar a lista de logons no SQL Server. Isso parece ter sido implementado porque a expectativa geral para um servidor ANSI SQL é que as permissões sejam conferidas em algum banco de dados principal do sistema, com os usuários desse banco de dados recebendo permissões. Em seguida, o comportamento padrão dos novos bancos de dados é consultar o mestre para ver quais permissões ele deve herdar. (SQL 101, eu sei, mas é realmente exemplificado aqui.)

Portanto, ao conceder CREATE DATABASE, você deve realmente ter um usuário mestre para conceder essa permissão. Se você tentar isso, ele funcionará (crie um usuário no master, conceda-o ao banco de dados e crie bancos de dados). No entanto, concedendo a criação de qualquer banco de dados (ou concedendo a função dbcreator), você não precisa ser um usuário literal no mestre.

Para ilustrar melhor a diferença entre as duas permissões, observe as diferentes mensagens retornadas concedendo a um usuário CREATE DATABASE no mestre e em outro banco de dados e, em seguida, enxágue e repita a permissão CREATE ANY DATABASE.

use master; GRANT CREATE DATABASE to TestUser

Msg 15151, Nível 16, Estado 1, Linha 1 Não é possível encontrar o usuário 'TestUser', porque ele não existe ou você não tem permissão.

Este erro ocorre porque o usuário TestUser ainda não está no banco de dados mestre. Essa é uma permissão no nível do banco de dados - não tem contexto para sair do banco de dados selecionado e procurar logins ou usuários. Observe que, se você criar o usuário primeiro no mestre, esse comando será bem-sucedido e você poderá criar bancos de dados como se CREATE ANY DATABASE lhe fosse concedido.

use master; GRANT CREATE ANY DATABASE to TestUser

Comando (s) concluído (s) com sucesso.

Isso ocorre porque, como uma permissão proprietária do Microsoft SQL Server, CREATE ANY DATABASE pode consultar a lista de logons da instância SQL, não apenas os usuários no banco de dados usado no momento.

use test; GRANT CREATE DATABASE to TestUser

Msg 15151, Nível 16, Estado 1, Linha 1 Não é possível encontrar o usuário 'TestUser', porque ele não existe ou você não tem permissão.

Isso demonstra a consistência da minha explicação para o primeiro exemplo. Observe a consulta abaixo e sua mensagem de erro resultante. Você não receberá essa mensagem de erro se criar o usuário nesse banco de dados pela primeira vez (consulte a última consulta).

use test; GRANT CREATE ANY DATABASE to TestUser

Mensagem 4621, nível 16, estado 10, linha 1 As permissões no escopo do servidor só podem ser concedidas quando o banco de dados atual é mestre

Conforme mostrado na segunda consulta, CREATE ANY DATABASE consulta a lista de logins, onde eu já havia criado esse nome de login. Portanto, enquanto o SQL Server reconheceu a existência do usuário, ele ainda está errado, porque estou tentando conceder uma permissão no nível do servidor em outro lugar que não seja o mestre, o que não é permitido no MSSQL.

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

A permissão CREATE DATABASE pode ser concedida apenas no banco de dados mestre. Msg 0, Nível 11, Estado 0, Linha 0 Ocorreu um erro grave no comando atual. Os resultados, se existirem, deveriam ser descartados.

Agora que existe um usuário para o qual CREATE DATABASE se aplica, recebi a mensagem de erro genérica de que você não pode conceder permissões no nível do servidor em nenhum lugar além do mestre, porque é onde o SQL Server armazena essas permissões.

Bem, isso foi divertido.

Tohuw
fonte