No Microsoft SQL Server, qual é a diferença entre as permissões CREATE DATABASE
e ?CREATE ANY DATABASE
Não consigo encontrar uma resposta confiável. O melhor que posso inferir é que (a) CREATE ANY
implica que posso criar o banco de dados para ser propriedade de outro usuário, enquanto com CREATE
eu não posso, ou (b) a permissão original nos dias do Sybase/SQL Server anterior era CREATE ANY
e CREATE
é alias para Conformidade ANSI.
Acredito ter encontrado a resposta confiável, muito ajudada 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ária do MSSQL. No entanto, os dois não são os mesmos. Na verdade, há uma distinção bastante importante entre os dois, e descobri isso tentando.
Ambas são permissões, mas CREATE DATABASE consulta apenas o contexto de segurança do banco de dados usado atualmente, enquanto CREATE ANY DATABASE pode consultar a lista de logins no SQL Server. Isso parece ser 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 usuários nesse banco de dados recebendo permissões. Então, o comportamento padrão de 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 ter um usuário no mestre para conceder essa permissão. Se você tentar isso, funcionará (crie um usuário no master, conceda a criação do banco de dados, então você pode criar bancos de dados). No entanto, ao conceder create any database (ou conceder a função dbcreator), você não precisa ser um usuário literal em master.
Para ilustrar ainda mais a diferença entre as duas permissões, observe as diferentes mensagens retornadas ao conceder a um usuário CREATE DATABASE no mestre em comparação com outro banco de dados e, em seguida, enxágue e repita para a permissão CREATE ANY DATABASE.
Este erro ocorre porque o usuário TestUser ainda não está no banco mestre. Esta é uma permissão no nível do banco de dados – não há contexto para sair do banco de dados selecionado e procurar logins ou usuários. Observe que, se você criar o usuário no mestre primeiro, esse comando será bem-sucedido e você poderá criar bancos de dados como se CREATE ANY DATABASE tivesse sido concedido a você.
Isso é bem-sucedido porque, como uma permissão proprietária do Microsoft SQL Server, CREATE ANY DATABASE pode consultar a lista de logins para a instância SQL, não apenas os usuários no banco de dados usado atualmente.
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á esta mensagem de erro se primeiro criar o usuário neste banco de dados (consulte a última consulta).
Conforme mostrado na segunda consulta, CREATE ANY DATABASE consulta a lista de logins, onde já havia criado este nome de login. Portanto, embora o SQL Server tenha reconhecido a existência do usuário, ele ainda apresenta erros porque estou tentando conceder uma permissão no nível do servidor em algum lugar diferente do mestre, o que não é permitido no MSSQL.
Agora que existe um usuário para CREATE DATABASE aplicar, recebo a mensagem de erro genérica de que você não pode conceder permissões de nível de servidor em nenhum lugar, exceto mestre, porque é onde o SQL Server armazena essas permissões.
Bem, isso foi divertido.