Siempre pensé que el usuario dbo
era el propietario real de la base de datos.
Eso es (o al menos debería ser) correcto. El nombre "dbo" de ese Usuario nunca cambia, sin embargo, el SID subyacente sí depende de quién creó la base de datos, o quién se configuró para ser a través de sp_changedbowner (aunque, incluido, SQL Server 2005) o ALTERAR AUTORIZACIÓN (comenzando con SQL Servidor 2008).
En los tres casos, el registro sys.databases
también cambia para que se mantengan sincronizados. Sin embargo, al restaurar una base de datos, ya sea desde otro sistema o desde la misma instancia, pero desde una base de datos que fue respaldada / desconectada antes de que se ejecutara uno de esos 2 comandos SQL para cambiar el propietario, luego al RESTAURAR o adjuntar, habrá haber un desajuste entre la owner_sid
columna en sys.databases
y el "dbo" sid
en sys.database_principals
el hecho de que DB.
Hasta donde yo sé, el registro en sys.database_principals
cada base de datos es el propietario real , y la owner_sid
columna en sys.databases
es una cuestión de mantenimiento de registros / conveniencia (similar a la desnormalización; sin sys.databases
el sistema necesitaría hacer consultas separadas en todas las bases de datos para obtenga esa información, cada vez que lo solicite!) y seguridad. Una cosa para la que se utiliza es para identificar un DB restaurado / adjunto potencialmente dañino / inválido si esos registros no coinciden. Intentar acceder a los ensamblados SQLCLR marcados como EXTERNAL_ACCESS
o UNSAFE
no se cargarán si uno ha elegido la ruta menos segura de activación, TRUSTWORTHY
ya que depende del SID "dbo", ya que debe coincidir con un inicio de sesión que tenga EXTERNAL ACCESS ASSEMBLY
oUNSAFE ASSEMBLY
permiso. Y cuando hay una falta de coincidencia en el SID entre esas dos vistas de catálogo del sistema, no se puede determinar cuál usar, y se usa como una señal de alerta por un posible problema de seguridad. De hecho, pruebo esta condición en el script de instalación para SQL # para alertar a alguien para que realice el cambio apropiado, solo para que no tengan que perder el tiempo buscándolo en caso de que SQL Server se queje en algún momento.