Este fato está documentado aqui:
ALTER AUTHORIZATION (Transact-SQL)
Se a entidade de destino não for um banco de dados e a entidade estiver sendo transferida para um novo proprietário, todas as permissões no destino serão descartadas.
Eu não tinha ideia sobre isso até encarar o fato.
Um dia houve a necessidade de dar EXECUTE
permissão em cada procedimento armazenado existente/futuro para algum usuário, este usuário é um membro da db_datareader
função de banco de dados apenas e ele não deve ser capaz de modificar nenhum dado, mas desde que a cadeia de propriedade em vigor uma vez que ele tenha uma EXECUTE
permissão, ele seria capaz de modificar os dados através dos procedimentos armazenados. Então tive que quebrar a cadeia de propriedade e gerar um script que alterava a autorização em todas as tabelas existentes para algum outro usuário.
Assim que a autorização foi alterada, todas as permissões em todas as tabelas desse banco de dados desapareceram. Verifiquei a documentação mencionada acima e descobri que esse comportamento está documentado. Mas é bastante inesperado (para mim, pelo menos), então eu me pergunto se alguém tem alguma explicação. Por que eles fizeram isso? Por que há a necessidade de descartar todas as permissões em alguma tabela se a autorização nela foi alterada?
Porque o novo proprietário não quer receber um objeto ao qual um monte de outras pessoas tem acesso?
Imagine comprar uma casa nova. Você espera que outras pessoas tenham acesso à sua nova casa? Ou você diria que cabe a você entregar as chaves/códigos da sua nova casa - para as pessoas em quem você confia?
É difícil responder a perguntas de "por quê", já que teríamos que estar na reunião quando isso foi decidido para ouvir o raciocínio indo e vindo. Mas acima é o meu palpite.
(Eu pensei sobre isso possivelmente ser do padrão SQL, mas não parece que há um comando ALTER AUTHORIZATION em ANSI/ISO SQL ...?)