SQL Server principal "dbo" n'existe pas,
j'obtiens l'erreur suivante
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.
j'ai lu à propos de ALTER AUTHORIZATION
, mais je n'ai aucune idée de la base de données dans laquelle cela se passe. Cette erreur se répand très fréquemment, et augmente le journal des erreurs d'environ 1 Go chaque jour.
8 réponses
j'ai résolu ce problème en définissant le propriétaire de la base de données. Ma base de données n'avait pas de propriétaire avant ce problème. Exécutez cette commande dans votre base de données pour mettre le propriétaire Sur le compte sysadmin:
use [YourDatabaseName] EXEC sp_changedbowner 'sa'
Fait Graphiquement.
clic droit sur la base de données-- > propriétés-- > fichiers-- > sélectionner le propriétaire de la base de données-- > sélectionner [sa]-- ok
USE [<dbname>]
GO
sp_changedbowner '<user>' -- you can use 'sa' as a quick fix in databases with SQL authentication
cela peut également se produire lorsque la base de données est une restauration à partir d'un serveur SQL différent ou d'une instance. Dans ce cas, le principal de sécurité " dbo " dans la base de données n'est pas le même que le principal de sécurité sur le serveur SQL sur lequel la base de données a été restaurée. Ne me demandez pas comment je le sais...
une autre façon de le faire
ALTER AUTHORIZATION
ON DATABASE::[DatabaseName]
TO [A Suitable Login];
si ce qui précède ne fonctionne pas, essayez ce qui suit. Cela a résolu le problème pour moi même lorsque le propriétaire était bien défini pour la base de données.
SQL Server 2008 échec de la réplication avec: le processus ne peut pas exécuter 'sp_replcmds'
réponse sélectionnée et quelques autres sont tous bons. Je veux juste donner une explication plus pure de SQL. Il vient à la même solution qu'il n'y a pas de propriétaire de base de données (valide).
compte du propriétaire de la base de données dbo
qui est mentionné par erreur est toujours créé avec la base de données. Il semble donc étrange qu'il n'existe pas, mais vous pouvez vérifier avec deux sélections (ou une, mais restons simples).
SELECT [name],[sid]
FROM [DB_NAME].[sys].[database_principals]
WHERE [name] = 'dbo'
qui montre SID de dbo
utilisateur en Base de données DB_NAME et
SELECT [name],[sid]
FROM [sys].[syslogins]
pour afficher tous les logins (et leurs SIDs) pour cette instance SQL server. Remarquez qu'il n'a pas écrit de préfixe db_name, c'est parce que chaque base de données a la même information dans cette vue.
donc en cas d'erreur au-dessus de là ne sera pas connexion avec SID qui est assignée à l'utilisateur de base de données dbo.
comme expliqué ci-dessus qui se produit généralement lors de la restauration de base de données à partir d'un autre ordinateur (où la base de données et l'utilisateur dbo ont été créés par un login différent). Et vous pouvez le corriger en changeant la propriété de connexion existante.
sous Sécurité, ajouter le principal comme un "utilisateur SQL sans login", lui faire propre le schéma avec le même nom que le principal et puis dans L'adhésion le faire db_owner.