web-dev-qa-db-fra.com

Création d'un identifiant SQL et d'un utilisateur sur une réplique TOUWONON

J'ai une base de données (DB1) qui est synchronisée (DB2) sur un autre serveur (via Twamson - SQL Server 2014).

Je veux donner à un utilisateur l'accès à DB2. Je crée un utilisateur de connexion et de base de données SQL dans DB1. Le nouvel utilisateur de la base de données est migré vers DB2, mais le login SQL n'est pas (ce qui est logique).

Le problème est que lorsque j'essaie de créer une connexion SQL pour l'utilisateur sur DB2 et de donner aux droits de lecture de l'utilisateur à DB2, liés au compte d'utilisateur provenant de DB1, je reçois une erreur disant que DB2 est en lecture seule et ne peut pas être modifiée.

Alors, comment puis-je accomplir cela?

1
Randy Minder

Vous devez créer le login sur le serveur DB2. Utilisez Script de Robert afin qu'il attrape le SID et le mot de passe, bien si c'est un compte SQL qui est.

Accordez ensuite la permission sur DB1. Cette autorisation sera automatiquement copiée par magie à DB2 en raison de l'AG.

Il n'y a aucun moyen de ne pas accorder la permission sur DB2. Cela doit être fait sur DB1. Vous pouvez contrôler l'accès en désactivant le login sur DB1 cependant.

7
Tara Kizer

Une option pour automatiser les connexions entre vos réplicas AG, si vous le souhaitez, mais peut également être utilisé comme une chose une fois aussi.

dbatools est un module qui offre du code pour la migration des instances SQL Server, mais j'ai également utilisé des répliques AG en synchronisation.

La fonction principale dont vous avez besoin pour synchroniser simplement les connexions est Copy-SqlLogin. Cela inclura le SID, le mot de passe et d'autres propriétés, comme indiqué via SSMS (mappings de base de données, etc.). Il s'agit de fonctionnalités similaires que le script tara référencé .

Copy-SqlLogin -Source DB1 -Destination DB2 -SyncOnly

Cette commande seule copiera les connexions de DB1 sur DB2 et synchroniser simplement tout ce qui a changé. Donc, dites que vous ajoutez une autre base de données à l'AG et accordez-vous à un accès de connexion (carte A), puis à la prochaine exécution de la commande ci-dessus, il mettra à jour ce login sur DB2 pour vous.

Le script ci-dessous est inclus pour la complétude juste pour montrer ce qui peut être fait. J'ai construit le processus ci-dessous sur 4 noeud AG d'un client comme une tâche planifiée. Cela offre également la possibilité d'exclure les répliques si vous avez besoin; C'était quelque chose qu'ils ont besoin.

#+++For debug just remove the "ErrorAction" and "WarningAction" parameters from the command+++
$localServerName = 'DB1'
$AGName = 'AG1'
$replicaExclude = 'DB3'
$excludeJobList = 'syspolicy_purge_history','DatabaseBackup - SYSTEM_DATABASES - FULL','DatabaseBackup - USER_DATABASES - DIFF','DatabaseBackup - USER_DATABASES - FULL','DatabaseBackup - USER_DATABASES - LOG'
$logfile = 'C:\Scripts\SyncProcess.log' 

# Where I had stored the module on the client computer
Import-Module 'C:\Scripts\dbatools\dbatools.psm1'

if (Test-Path $logfile) {Remove-Item $logfile -Force}
Start-Transcript -Path $logfile -Force -NoClobber

$r = Get-SqlAvailabilityGroup -SqlServer $localServerName -AvailabilityGroupname $AGName -IsPrimary
if ($r)
{
    $srvs = (Get-SqlAvailabilityGroup -SqlServer $localServerName -AvailabilityGroupname $AGName | where {$_.ReplicaName -ne $localServerName -and $replicaExclude -NotContains $_.ReplicaName}).ReplicaName
    foreach ($s in $srvs)
    {
        Write-Host "Working on $s" -ForegroundColor Red
        #Copy logins to destination, ignoring errors and warning messages to keep output low
        Copy-SqlLogin -Source $localServerName -Destination $s -SyncOnly -ErrorAction SilentlyContinue -WarningAction SilentlyContinue

        #copy operators
        Copy-SqlOperator -Source $localServerName -Destination $s

        #Copy jobs to destination
        Copy-SqlJob -Source $localServerName -Destination $s -Force -Exclude $excludeJobList
    }
}
Stop-Transcript
2
user507

Lorsque vous créez la même connexion sur le deuxième serveur, vous devrez vous assurer de le créer avec le même SID et le même mot de passe que j'ai été créé sur le serveur principal. Les étapes que je suis sont énumérées ci-dessous:

  • Déployez les 2 procédures stockées ( SP_HEXADECIMAL et SP_HELP_REVLOGIN ), comme indiqué dans le lien ci-dessous sur la DB maître de la réplique principale - ces SPS vous aideront à générer une connexion Script de création qui peut ensuite être exécuté sur une réplique secondaire
  • Créez une nouvelle connexion sur la réplique principale
  • Exécutez la procédure stockée suivante, qui a été créée comme APPT de l'étape 1, passant dans le "nom de connexion".

            EXEC sp_help_revlogin 'Login_Name'
    
  • Copiez le script généré de la marche ci-dessus et de l'exécuter sur la réplique secondaire

1
Masood Hashim

Je crois que c'est le genre de chose qui confinement partiel est conçu pour traiter.

Veuillez noter qu'il y a assez de considérations Si vous choisissez d'utiliser une base de données partiellement contenue.

Voici comment vous pouvez définir cela à l'aide du primaire (n'oubliez pas de tester dans un environnement de non-production afin de pouvoir prendre conscience de la manière dont votre environnement de production peut répondre à la liste des considérations susmentionnées).

use master;
go
sys.sp_configure 'contained database authentication',1;
go
reconfigure with override;
go

use master;
go
alter database DB1 set containment = partial;
go


use DB1
go
create user test with password=N'#c0n+@Ined!';
go
use DB1
go
alter role db_datareader add member test;
go
0
swasheck

Vous avez dit que vous venez de créer le login sur le premier serveur et que l'utilisateur correspondant est migré vers DB2. Donc, tout ce dont vous avez besoin est de créer la même connexion sur le deuxième serveur préservant son SID, et vous pouvez le faire d'abord en copiant le SID de la connexion à partir de SYS.SERVER_PRINCIPALS, puis en créant le même identifiant à l'aide de :avec SID comme ça:

create login my_login with password = '*****', sid = 0x6E94CADC0A6EEC439B620643CDDB5C71 -- put here your login's sid 
0
sepupic