web-dev-qa-db-fra.com

Sauvegarder les connexions d'instance SQL Server 2016

J'ai besoin de sauvegarder une instance de SQL Server 2016, j'ai déjà des sauvegardes nocturnes des bases de données souhaitées mais j'ai besoin de sauvegarder les utilisateurs et les rôles pour l'instance ..... Comment puis-je faire cela? Travail intégré ou T-sql personnalisé que je peux planifier pour exécuter?

Je ne suis pas très bon avec SQL si quelqu'un peut m'orienter dans la bonne direction

8
NULL.Dude

En général

J'envisagerais de lire quelles informations la base de données master contient et pourquoi vous devez sauvegarder les bases de données système (master, msdb, ...).

Référence:Sauvegarde et restauration des bases de données système (SQL Server) = (Microsoft Docs)

base de données master

La base de données master contient les informations suivantes pour chaque instance SQL Server:

La base de données master enregistre toutes les informations de niveau système pour un système SQL Server. Cela inclut les métadonnées à l'échelle de l'instance telles que les comptes de connexion , les points de terminaison, les serveurs liés et les paramètres de configuration du système. Dans SQL Server, les objets système ne sont plus stockés dans la base de données master; au lieu de cela, ils sont stockés dans la base de données des ressources. En outre, master est la base de données qui enregistre l'existence de toutes les autres bases de données et l'emplacement de ces fichiers de base de données et enregistre les informations d'initialisation pour SQL Server. Par conséquent, SQL Server ne peut pas démarrer si la base de données master n'est pas disponible.

( accentuation la mienne)

Référence:base de données master (Microsoft Docs) =

base de données msdb

La base de données msdb contient les informations suivantes d'une instance de SQL Server:

La base de données msdb est utilisée par l'Agent SQL Server pour planifier des alertes et des travaux et par d'autres fonctionnalités telles que SQL Server Management Studio, Service Broker et la messagerie de base de données.

Par exemple, SQL Server gère automatiquement un historique complet de sauvegarde et de restauration en ligne dans les tables en msdb . Ces informations incluent le nom de la partie qui a effectué la sauvegarde, l'heure de la sauvegarde et les périphériques ou fichiers sur lesquels la sauvegarde est stockée. SQL Server Management Studio utilise ces informations pour proposer un plan de restauration d'une base de données et d'application des sauvegardes du journal des transactions. Les événements de sauvegarde pour toutes les bases de données sont enregistrés même s'ils ont été créés avec des applications personnalisées ou des outils tiers. Par exemple, si vous utilisez une application Microsoft Visual Basic qui appelle des objets SMO (SQL Server Management Objects) pour effectuer des opérations de sauvegarde, l'événement est enregistré dans les tables système msdb, le journal des applications Microsoft Windows et le journal des erreurs SQL Server. Pour vous aider à protéger les informations stockées dans msdb, nous vous recommandons d'envisager de placer le journal des transactions msdb sur un stockage tolérant aux pannes.

( accentuation la mienne)

Référence:base de données msdb (Microsoft Docs) =

Conclusion

Si vous sauvegardez la base de données master, toutes les informations de connexion de l'instance sont sécurisées. Cependant, si vous souhaitez sauvegarder séparément ( comme dans: utilisé pour transférer les connexions à différentes instances, utilisé pour réinitialiser les mots de passe) les connexions SQL de l'instance, vous devrez alors appliquer une autre Solution.

Solutions de sauvegarde de connexion SQL Server individuelles

Liste de référence des outils

Bonus supplémentaire

La dernière référence est un article intéressant sur la façon d'exporter manuellement les connexions SQL Server et les mots de passe hachés afin de les transférer manuellement vers une nouvelle instance SQL Server. L'article implique la création de deux procédures stockées, puis l'exécution d'une pour créer les informations.

Voici le code de l'article référencé pour créer les deux procédures:

USE master
GO
IF OBJECT_ID ('sp_hexadecimal') IS NOT NULL
  DROP PROCEDURE sp_hexadecimal
GO
CREATE PROCEDURE sp_hexadecimal
    @binvalue varbinary(256),
    @hexvalue varchar (514) OUTPUT
AS
DECLARE @charvalue varchar (514)
DECLARE @i int
DECLARE @length int
DECLARE @hexstring char(16)
SELECT @charvalue = '0x'
SELECT @i = 1
SELECT @length = DATALENGTH (@binvalue)
SELECT @hexstring = '0123456789ABCDEF'
WHILE (@i <= @length)
BEGIN
  DECLARE @tempint int
  DECLARE @firstint int
  DECLARE @secondint int
  SELECT @tempint = CONVERT(int, SUBSTRING(@binvalue,@i,1))
  SELECT @firstint = FLOOR(@tempint/16)
  SELECT @secondint = @tempint - (@firstint*16)
  SELECT @charvalue = @charvalue +
    SUBSTRING(@hexstring, @firstint+1, 1) +
    SUBSTRING(@hexstring, @secondint+1, 1)
  SELECT @i = @i + 1
END

SELECT @hexvalue = @charvalue
GO

IF OBJECT_ID ('sp_help_revlogin') IS NOT NULL
  DROP PROCEDURE sp_help_revlogin
GO
CREATE PROCEDURE sp_help_revlogin @login_name sysname = NULL AS
DECLARE @name sysname
DECLARE @type varchar (1)
DECLARE @hasaccess int
DECLARE @denylogin int
DECLARE @is_disabled int
DECLARE @PWD_varbinary  varbinary (256)
DECLARE @PWD_string  varchar (514)
DECLARE @SID_varbinary varbinary (85)
DECLARE @SID_string varchar (514)
DECLARE @tmpstr  varchar (1024)
DECLARE @is_policy_checked varchar (3)
DECLARE @is_expiration_checked varchar (3)

DECLARE @defaultdb sysname

IF (@login_name IS NULL)
  DECLARE login_curs CURSOR FOR

      SELECT p.sid, p.name, p.type, p.is_disabled, p.default_database_name, l.hasaccess, l.denylogin FROM 
sys.server_principals p LEFT JOIN sys.syslogins l
      ON ( l.name = p.name ) WHERE p.type IN ( 'S', 'G', 'U' ) AND p.name <> 'sa'
ELSE
  DECLARE login_curs CURSOR FOR


      SELECT p.sid, p.name, p.type, p.is_disabled, p.default_database_name, l.hasaccess, l.denylogin FROM 
sys.server_principals p LEFT JOIN sys.syslogins l
      ON ( l.name = p.name ) WHERE p.type IN ( 'S', 'G', 'U' ) AND p.name = @login_name
OPEN login_curs

FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @hasaccess, @denylogin
IF (@@fetch_status = -1)
BEGIN
  PRINT 'No login(s) found.'
  CLOSE login_curs
  DEALLOCATE login_curs
  RETURN -1
END
SET @tmpstr = '/* sp_help_revlogin script '
PRINT @tmpstr
SET @tmpstr = '** Generated ' + CONVERT (varchar, GETDATE()) + ' on ' + @@SERVERNAME + ' */'
PRINT @tmpstr
PRINT ''
WHILE (@@fetch_status <> -1)
BEGIN
  IF (@@fetch_status <> -2)
  BEGIN
    PRINT ''
    SET @tmpstr = '-- Login: ' + @name
    PRINT @tmpstr
    IF (@type IN ( 'G', 'U'))
    BEGIN -- NT authenticated account/group

      SET @tmpstr = 'CREATE LOGIN ' + QUOTENAME( @name ) + ' FROM WINDOWS WITH DEFAULT_DATABASE = [' + @defaultdb + ']'
    END
    ELSE BEGIN -- SQL Server authentication
        -- obtain password and sid
            SET @PWD_varbinary = CAST( LOGINPROPERTY( @name, 'PasswordHash' ) AS varbinary (256) )
        EXEC sp_hexadecimal @PWD_varbinary, @PWD_string OUT
        EXEC sp_hexadecimal @SID_varbinary,@SID_string OUT

        -- obtain password policy state
        SELECT @is_policy_checked = CASE is_policy_checked WHEN 1 THEN 'ON' WHEN 0 THEN 'OFF' ELSE NULL END FROM sys.sql_logins WHERE name = @name
        SELECT @is_expiration_checked = CASE is_expiration_checked WHEN 1 THEN 'ON' WHEN 0 THEN 'OFF' ELSE NULL END FROM sys.sql_logins WHERE name = @name

            SET @tmpstr = 'CREATE LOGIN ' + QUOTENAME( @name ) + ' WITH PASSWORD = ' + @PWD_string + ' HASHED, SID = ' + @SID_string + ', DEFAULT_DATABASE = [' + @defaultdb + ']'

        IF ( @is_policy_checked IS NOT NULL )
        BEGIN
          SET @tmpstr = @tmpstr + ', CHECK_POLICY = ' + @is_policy_checked
        END
        IF ( @is_expiration_checked IS NOT NULL )
        BEGIN
          SET @tmpstr = @tmpstr + ', CHECK_EXPIRATION = ' + @is_expiration_checked
        END
    END
    IF (@denylogin = 1)
    BEGIN -- login is denied access
      SET @tmpstr = @tmpstr + '; DENY CONNECT SQL TO ' + QUOTENAME( @name )
    END
    ELSE IF (@hasaccess = 0)
    BEGIN -- login exists but does not have access
      SET @tmpstr = @tmpstr + '; REVOKE CONNECT SQL TO ' + QUOTENAME( @name )
    END
    IF (@is_disabled = 1)
    BEGIN -- login is disabled
      SET @tmpstr = @tmpstr + '; ALTER LOGIN ' + QUOTENAME( @name ) + ' DISABLE'
    END
    PRINT @tmpstr
  END

  FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @hasaccess, @denylogin
   END
CLOSE login_curs
DEALLOCATE login_curs
RETURN 0
GO

Une fois que vous avez créé les procédures stockées, exécutez sp_help_rev_login pour récupérer les informations.

EXEC sp_help_revlogin

Le script de sortie généré par la procédure stockée sp_help_revlogin est le script de connexion. Ce script de connexion crée les connexions qui ont l'identificateur de sécurité (SID) d'origine et le mot de passe d'origine.

Référence:Comment transférer les connexions et les mots de passe entre les instances de SQL Server = (Article Microsoft KB)

Prendre plaisir

9
John aka hot2use

Vous devriez voir si DBATools est une solution pour vous.

dbatools est un module PowerShell gratuit avec plus de 300 fonctions d'administration SQL Server, les meilleures pratiques et les commandes de migration incluses.

Obtenez des membres de tous les rôles sur une instance SQL. La sortie par défaut comprend les colonnes SqlServer, Database, Role, Member.

commande Export-DBAUser via DBATools

téléchargement DBATools

3
Shaulinator

Les deux réponses sont bonnes.

Je veux juste ajouter une autre option de la nôtre @ Kenneth-Fisher :

Exemple de code:

EXEC master.dbo.sp_SrvPermissions 
    @Principal = 'NULL',
    @Role = NULL, 
    @Type = NULL,
    @DBName = NULL,
    @UseLikeSearch = 1,
    @IncludeMSShipped = 0,
    @DropTempTables = 1,
    @Output = 'Default',
    @Print = 0

EXEC master.dbo.sp_DBPermissions
    @DBName = 'ALL',
    @Principal = 'NULL',
    @IncludeMSShipped = 0,
    @Role = NULL,
    @Type = NULL,
    @ObjectName = NULL,
    @Permission = NULL,
    @LoginName = NULL,
    @Print = 0;
2
Marian