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
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)
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) =
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) =
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.
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
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.
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;