No Microsoft SQL Server, qual é a diferença entre as permissões CREATE DATABASE
e CREATE ANY DATABASE
?
Não consigo encontrar uma resposta autorizada. O melhor que posso deduzir é que (a) CREATE ANY
implica que eu posso criar o banco de dados para pertencer a outro usuário, enquanto CREATE
que não posso, ou (b) a permissão original nos dias do Sybase / SQL Server inicial era CREATE ANY
e CREATE
é alias para Conformidade com ANSI.
sql-server
permissions
Tohuw
fonte
fonte
Respostas:
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.
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.
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.
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).
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.
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.
fonte