Será um BUG de Update no SQL Server?

Ola Pessoal,

Garanto que o titulo desse post chamou a atenção de vocês, por isso estão aqui lendo Alegre. Nesse final de final de semana estive fazendo curso de SQL Server, e um dos capitulos do curso era sobre segurança onde trabalhavamos com logins, users, roles, server-role, Database Principals e por ai vai.. Mais o que me chamou a atenção nesse assunto foi que uma pergunta de um dos alunos que era mais ou menos assim: Se eu der a permissão para o meu user na database de db_datawriter ele poderá realizar insert, delete e update? No momento foi respondido que sim, o usuario podera realizar esses três comandos DDL’s. Agora pessoal o que eu pergunto pra voces é o seguinte: Só com essa role de database (db_datawriter) eu consigo realizar essas três ações?

Vocês se perguntam: Bom se eu (Marcos Freccia) estou fazendo um post sobre isso é claro que não dá, pois eu não estaria fazendo post para dizer que funciona Alegre.

Agora fica a questão: Porque não dá?

Vamos então para os testes.

— criação de login, user e permissoes
use master
go
create login freccia
with password = ‘123’,
check_policy = off
go
use AdventureWorks
go
create user freccia for login freccia
go
grant connect to freccia
EXEC sp_addrolemember N’db_datawriter’, N’freccia’
go

Script criado, vamos nos conectar no SQL Server com esse login e vamos selecionar base de dados AdventureWorks, a seguir vamos executar as seguintes consultas.

use AdventureWorks
go

update dbo.DatabaseLog
set PostTime = GETDATE()
where DatabaseLogID = 1
go

delete from dbo.DatabaseLog
where DatabaseLogID = 2

Imagem1

Olhando esse erro acima, podemos concluir que o SQL Server tem um baita de um BUG ai, onde ja se viu uma coisa dessa, eu quero que o SQL Server atualize e apague um dado, eu não mandei dar select em nenhum lugar. Vamos pensar um pouquinho melhor nessas duas consultas que acabamos de executar.

Primeiramente mandei o SQL Server realizar um update, ou seja, não mandei ele inserir um registro que nao existia na tabela, apenas disse que ele deveria atualizar um registro que ja existe. Esse registro ja existindo na tabela como vamos localiza-lo? Realizando uma LEITURA.

O caso da segunda consulta é igual a primeira, eu ja tenho o registro na tabela, nao preciso inserir, só quero excluir, logo para excluir algo que existe devemos procura-lo. Como? Realizando uma LEITURA.

Para que meu usuario possa então atualizar o meu registo e depois deletar algum outro qualquer precisamos da role db_datareader. Agora basta executarmos no SQL Server o seguinte comando.

EXEC sp_addrolemember N’db_datareader’, N’freccia’

E executando novamente o update e delete temos a seguinte mensagem.

Imagem2

E apenas para constar que o comando rodou corretamente vamos recuperar os registros envolvidos.

select * from dbo.DatabaseLog
where DatabaseLogID in (1,2)

Imagem3

Como podem ver no registro 1 foi atualizado o campo PostTime com o momento eu estava escrevendo este post, já o registro 2 foi corretamente deletado da minha tabela.

Então pessoal, esse post foi para mostrar um comportamento do SQL Server, que ao meu ponto de vista está totalmente correto. Espero que tenham gostado e assim que possivel volto mostrando mais detalhes de permissionamento dentro do SQL Server.

Marcos Freccia
MCTS SQL Server 2008 Database Implementation and Maintenance
MCTS SQL Server 2008 Database Developer
@SqlFreccia

Sobre Marcos Freccia

MVP em SQL Server (Data Plataform) , especialista em SQL Server, e atualmente trabalhando com Microsoft Azure!

Publicado em agosto 1, 2011, em Administração, VirtualPass e marcado como , , , , , . Adicione o link aos favoritos. 2 Comentários.

  1. Muito boa!! Faz total sentido mesmo, e eu mesmo tinha falado na aula que pra fazer update ele antes faz um select naquele registro. Foi mancada minha mesmo, devia ter comentado na aula ow😛
    Essa semana lembra de comentar e indicar esse post pra turma o/

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: