92 votes

Le SID du propriétaire de la base de données enregistré dans la base de données principale diffère du SID du propriétaire de la base de données.

Lorsque j'essaie d'installer tSQLt sur une base de données existante, j'obtiens l'erreur suivante :

Le SID du propriétaire de la base de données enregistré dans la base de données principale diffère du SID du propriétaire de la base de données enregistré dans la base de données ''. le SID du propriétaire de la base de données enregistré dans la base de données ''. Vous devez corriger cette situation en réinitialisant le propriétaire de la base de données '' à l'aide de l'instruction ALTER AUTHORIZATION.

149voto

JohnnyM Points 3483

Ce problème peut survenir lorsqu'une base de données est restaurée à partir d'une sauvegarde et que le SID du propriétaire de la base de données ne correspond pas au SID des propriétaires répertoriés dans la base de données maître. Voici une solution qui utilise l'instruction "ALTER AUTHORIZATION" recommandée dans le message d'erreur :

DECLARE @Command VARCHAR(MAX) = 'ALTER AUTHORIZATION ON DATABASE::[<<DatabaseName>>] TO 
[<<LoginName>>]' 

SELECT @Command = REPLACE(REPLACE(@Command 
            , '<<DatabaseName>>', SD.Name)
            , '<<LoginName>>', SL.Name)
FROM master..sysdatabases SD 
JOIN master..syslogins SL ON  SD.SID = SL.SID
WHERE  SD.Name = DB_NAME()

PRINT @Command
EXEC(@Command)

1 votes

Merci ! Cela semble plus approprié. Pensez-vous qu'il n'est pas utile d'utiliser quotename() au lieu de mettre le '[' dans la chaîne ? Peut-être aussi sélectionner dans var DBName et var LoginName puis les rassembler dans var Command au lieu d'utiliser REPLACE() ?

3 votes

Si vous avez des espaces ou des caractères spéciaux comme '-' dans votre nom de base de données, ce script vous donnera une erreur. Il suffit donc de mettre des crochets [] comme ceci : 'ALTER AUTHORIZATION ON DATABASE: :[<<DatabaseName>>] TO [<<LoginName>>]''.

11 votes

Lorsque je l'exécute, j'obtiens l'erreur "Le nouveau propriétaire de la base de données proposé est déjà un utilisateur ou un alias dans la base de données".

31voto

JDPeckham Points 831

Ajouté ceci au début du script de tSQLt.class.sql

declare @user varchar(50)
SELECT  @user = quotename(SL.Name)
  FROM  master..sysdatabases SD inner join master..syslogins SL
    on  SD.SID = SL.SID
 Where  SD.Name = DB_NAME()
exec('exec sp_changedbowner ' + @user)

0 votes

Cela a fonctionné comme un charme avec tSQLt Version: 1.0.5873.27393 et semble être une solution plus simple. Utilisation de MS SQL Server 2019 Developer et SSMS 18.

21voto

NarendraMishra Points 201

Appliquez le script ci-dessous sur la base de données vous obtenez l'erreur :

EXEC sp_changedbowner 'sa'

ALTER DATABASE [database_name] SET TRUSTWORTHY ON

1 votes

La deuxième déclaration concerne la vulnérabilité de sécurité suivante : VA1102 - Le bit de confiance doit être désactivé sur toutes les bases de données sauf MSDB.

5voto

Quandary Points 12867

Nécromancie :
Si vous ne voulez pas utiliser les vues SQL-Server 2000 (dépréciées), utilisez ceci :

-- Restore sid when db restored from backup... 
DECLARE @Command NVARCHAR(MAX) 
SET @Command = N'ALTER AUTHORIZATION ON DATABASE::<<DatabaseName>> TO <<LoginName>>' 
SELECT @Command = REPLACE 
                  ( 
                      REPLACE(@Command, N'<<DatabaseName>>', QUOTENAME(SD.Name)) 
                      , N'<<LoginName>>' 
                      ,
                      QUOTENAME
                      (
                          COALESCE
                          (
                               SL.name 
                              ,(SELECT TOP 1 name FROM sys.server_principals WHERE type_desc = 'SQL_LOGIN' AND is_disabled = 'false' ORDER BY principal_id ASC )
                          )
                      )
                  ) 
FROM sys.databases AS SD
LEFT JOIN sys.server_principals  AS SL 
    ON SL.SID = SD.owner_sid 

WHERE SD.Name = DB_NAME() 

PRINT @command 
EXECUTE(@command) 
GO

Empêche également le bogue sur une base de données ou un utilisateur au nom bizarre, et corrige également le bogue si aucun utilisateur n'est associé (utilise le login sa).

5voto

Shadi Namrouti Points 1453

Le moyen le plus simple de changer le propriétaire d'une BD est de le faire :

EXEC SP_ChangeDBOwner 'sa'

0 votes

Oui, nous l'avons établi.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X