Recentemente, tivemos uma pergunta em que o usuário dbo
em um banco de dados tinha um sid
que não correspondia ao owner_sid
arquivo sys.databases
. Entendo como o proprietário do banco de dados é diferente dos membros da função db_owner
, mas sempre pensei que o usuário dbo
fosse o proprietário real do banco de dados. Não é esse o caso? E se sim, existem diferenças reais entre dbo
e o que está dentro sys.databases
?
Isso é (ou pelo menos deveria ser) correto. O nome "dbo" desse usuário nunca muda, mas o SID subjacente muda dependendo de quem criou o banco de dados ou de quem ele foi definido para ser via sp_changedbowner (inclusive, SQL Server 2005) ou ALTER AUTHORIZATION (começando com SQL Servidor 2008).
Em todos esses três casos, o registro
sys.databases
também é alterado para que sejam mantidos em sincronia. No entanto, ao restaurar um banco de dados, seja de outro sistema ou da mesma instância, mas de um banco de dados que foi submetido a backup / desanexado antes de um desses 2 comandos SQL serem executados para alterar o proprietário, após RESTORE ou anexar, haverá seja uma incompatibilidade entre aowner_sid
colunasys.databases
e o "dbo"sid
nessesys.database_principals
banco de dados.Até onde eu sei, o registro em
sys.database_principals
cada banco de dados é o proprietário realowner_sid
, e a coluna emsys.databases
é uma questão de manutenção de registros/conveniência (semelhante à desnormalização; semsys.databases
o sistema precisaria fazer consultas separadas em todos os bancos de dados para obter essa informação, sempre que solicitado!) e segurança. Uma coisa para a qual ele é usado é identificar um banco de dados potencialmente prejudicial/inválido restaurado/anexado se esses registros não corresponderem. Tentar acessar assemblies SQLCLR marcados comoEXTERNAL_ACCESS
ouUNSAFE
não serão carregados se alguém tiver escolhido a rota menos segura de habilitaçãoTRUSTWORTHY
, pois depende do SID "dbo", pois ele precisa corresponder a um logon que tenha oEXTERNAL ACCESS ASSEMBLY
ouUNSAFE ASSEMBLY
permissão. E quando há uma incompatibilidade no SID entre essas duas exibições do catálogo do sistema, não é possível determinar qual usar e é usado como um sinal de alerta para um possível problema de segurança. Na verdade, eu testo essa condição no script de instalação do SQL# para alertar alguém para fazer a alteração apropriada, apenas para que eles não tenham que perder tempo caçando-o caso o SQL Server reclame disso em algum momento.