El principal de SQL Server "dbo" no existe,

195

Estoy teniendo el siguiente error

Cannot execute as the database principal because the principal "dbo" 
does not exist, this type of principal cannot be impersonated,
or you do not have permission.

Leí sobre ALTER AUTHORIZATION, pero no tengo idea de en qué base de datos está sucediendo esto. Este error se escupe con mucha frecuencia y aumenta el registro de errores en aproximadamente 1 GB todos los días.

PBG
fuente
1
Esta es probablemente una pregunta para el sitio de DBA, pero ayudaría si proporciona más información sobre cuándo aparece el error, es decir, qué comando no se puede ejecutar. Y hay muchos resultados de búsqueda para este error, incluida esta pregunta ; ¿los ha mirado y coinciden con su situación y configuración de alguna manera?
Pondlife

Respuestas:

415

Resolví este problema estableciendo el propietario de la base de datos. Mi base de datos no tenía ningún propietario antes de este problema. Ejecute este comando en su base de datos para configurar el propietario en la cuenta sysadmin:

use [YourDatabaseName] EXEC sp_changedbowner 'sa'
Hogan
fuente
66
Ver artículo detallado aquí: sqlserver-help.com/tag/…
orberkov
8
@hurleystylee, su solución realmente funcionó bien para mí. Mi DB tenía un dueño por cierto.
Keyvan Sadralodabai
Estoy teniendo este mismo problema. Intenté ejecutar la consulta por @hurleystylee, se ejecutó pero no hizo nada. Cuando verifiqué dboaún estaba db_owner y NO PUEDO HACER NADA AL DBO. Se está volviendo realmente frustrante. No puedo cambiar nada.
Wairimu Murigi
@hurleystylee, considere editar y complementar la respuesta para que las personas no tengan que mirar los comentarios para averiguar la sintaxis del comando.
Ulises Alves
2
@hurleystylee sí, ya veo que lo hizo. Creo que de esta manera la respuesta se vuelve más completa por sí sola.
Ulises Alves
112

ingrese la descripción de la imagen aquí

Hacer gráficamente.

Haga clic derecho en la base de datos -> propiedades -> archivos -> seleccione el propietario de la base de datos -> seleccione [sa] - ok

arnav
fuente
Una vez más resolvió mi problema volviendo a esta respuesta.
teapeng
¡Justo en el clavo! ¡Gracias!
alejandrob
Teníamos DB restaurada desde la instancia de diff SQL. Seguí este paso y funcionó ... ¡Gracias!
dotnetavalanche
11

Esto también puede suceder cuando la base de datos es una restauración desde un servidor o instancia SQL diferente. En ese caso, el principal de seguridad 'dbo' en la base de datos no es el mismo que el principal de seguridad en el servidor SQL en el que se restauró la base de datos. No me preguntes cómo sé esto ...

Peter Huppertz
fuente
¿Puedo preguntarte cómo resolverlo? jajaja, eso es exactamente lo que estoy tratando de hacer. Mueva los diagramas de la base de datos entre diferentes servidores y luego implemente la base de datos. Recibí este error una vez que importé el archivo .bak e intenté abrir la carpeta de diagramas.
gunslingor
1
Hey, esto funcionó para mí: dba.stackexchange.com/questions/50690/...
ironstone13
@ ironstone13 no funcionó para mí. Recibí el mensaje de que no puedo dejar dbo
Wairimu Murigi
8

otra forma de hacerlo

ALTER AUTHORIZATION 
ON DATABASE::[DatabaseName]
TO [A Suitable Login];
Mugiwara
fuente
6

La respuesta seleccionada y algunas otras son buenas. Solo quiero dar una explicación más pura de SQL. Se trata de la misma solución que no hay un propietario de base de datos (válido).

La cuenta del propietario de la base de datos dboque se menciona por error siempre se crea con la base de datos. Por lo tanto, parece extraño que no exista, pero puede verificarlo con dos selecciones (o una, pero hagámoslo simple).

SELECT [name],[sid] 
FROM [DB_NAME].[sys].[database_principals]
WHERE [name] = 'dbo'

que muestra el SID del dbousuario en la base de datos DB_NAME y

SELECT [name],[sid] 
FROM [sys].[syslogins]

para mostrar todos los inicios de sesión (y sus SID) para esta instancia del servidor SQL. Tenga en cuenta que no escribió ningún prefijo db_name, porque cada base de datos tiene la misma información en esa vista.

Entonces, en caso de error anterior , no habrá inicio de sesión con SID asignado al usuario de base de datos dbo.

Como se explicó anteriormente, eso generalmente ocurre cuando se restaura la base de datos desde otra computadora (donde la base de datos y el usuario de dbo se crearon mediante un inicio de sesión diferente) Y puede solucionarlo cambiando la propiedad al inicio de sesión existente.

Bizniztime
fuente
0

En Seguridad, agregue el principal como "usuario SQL sin inicio de sesión", haga que sea el propietario del esquema con el mismo nombre que el principal y luego, en Membresía, hágalo db_owner.

David Zamula
fuente
Esto no hizo nada en SSMS 2017
Zimano
0

También tuve este error cuando accidentalmente alimentó una cadena de conexión de base de datos al espejo de solo lectura, no la base de datos primaria en una configuración de alta disponibilidad.

fíat
fuente
0

Como decía el mensaje, debe establecer un permiso como propietario para su usuario. Entonces puedes usar lo siguiente:

ALTER AUTHORIZATION 
ON DATABASE::[YourDBName]
TO [UserLogin];

Espero que sea útil! Deja un comentario si te parece bien.

Alireza Abdollahnejad
fuente