J'ai besoin de créer un script pour un rôle d'application avec un mot de passe haché, afin de pouvoir le copier d'une base de données à une autre.
Prenons l'exemple de code suivant, qui utilise un rôle d'application pour fournir un accès élevé à un utilisateur non approuvé:
USE tempdb;
CREATE LOGIN LimitedLogin
WITH PASSWORD = 'Password1'
, CHECK_POLICY = OFF
, CHECK_EXPIRATION = OFF;
CREATE USER LimitedLogin
FOR LOGIN LimitedLogin
WITH DEFAULT_SCHEMA = dbo;
CREATE APPLICATION ROLE MyAppRole
WITH PASSWORD = 'Password2'
, DEFAULT_SCHEMA = dbo;
EXEC sp_addrolemember @rolename = 'db_datareader'
, @membername = 'MyAppRole';
CREATE TABLE dbo.Numbers
(
[Number] int CONSTRAINT PK_Numbers
PRIMARY KEY CLUSTERED
IDENTITY(1,1) NOT NULL
);
INSERT INTO dbo.Numbers
VALUES (1)
, (2);
GO
Une fois que nous avons créé la configuration de test dans tempdb, nous pouvons nous connecter en tant [LimitedLogin]
qu'utilisateur et exécuter ce qui suit:
-- login as [LimitedLogin]
USE tempdb;
SELECT *
FROM dbo.Numbers;
L'erreur suivante est renvoyée, comme prévu:
Msg 229, Level 14, State 5, Line 1
The SELECT permission was denied on the object 'Numbers'
, database 'Test', schema 'dbo'.
Cependant, une fois que nous avons exécuté le sp_setapprole
avec le mot de passe approprié, nous pouvons voir les résultats souhaités dans le dbo.Numbers
tableau:
DECLARE @cookie VARBINARY(8000);
EXEC sp_setapprole @rolename = 'MyAppRole'
, @password = 'Password2'
, @fCreateCookie = 1
, @cookie = @cookie OUT;
SELECT @cookie;
SELECT TOP(10) *
FROM dbo.Numbers;
EXEC sp_unsetapprole @cookie = @cookie;
J'aimerais pouvoir automatiser la création du rôle d'application en le scriptant à partir d'une base de données source à appliquer à une base de données de destination. Je peux facilement effectuer la majorité de cela en:
SELECT 'CREATE APPLICATION ROLE ' + QUOTENAME(dp.name) + '
WITH PASSWORD = ''xxxx''
, DEFAULT_SCHEMA = ' + QUOTENAME(dp.default_schema_name) + ';'
FROM sys.database_principals dp
WHERE dp.type_desc = 'APPLICATION_ROLE';
Cependant, j'aimerais vraiment pouvoir avoir le mot de passe haché dans le script, quelque chose comme:
CREATE APPLICATION ROLE [MyAppRole]
WITH PASSWORD = 0x12345678 HASHED
, DEFAULT_SCHEMA = [dbo];
Est-ce possible? Vraisemblablement, la version hachée du mot de passe du rôle d'application est stockée quelque part dans la base de données.
À l'aide de la fonctionnalité «Script to ->» de SQL Server Management Studio, le rôle d'application est scripté avec un nouveau mot de passe, comme suit:
/****** Object: ApplicationRole [MyAppRole] Script Date: 9/22/2015 10:18:12 AM ******/
/* To avoid disclosure of passwords, the password is generated in script. */
declare @idx as int
declare @randomPwd as nvarchar(64)
declare @rnd as float
select @idx = 0
select @randomPwd = N''
select @rnd = rand((@@CPU_BUSY % 100) + ((@@IDLE % 100) * 100) +
(DATEPART(ss, GETDATE()) * 10000) + ((cast(DATEPART(ms, GETDATE()) as int) % 100) * 1000000))
while @idx < 64
begin
select @randomPwd = @randomPwd + char((cast((@rnd * 83) as int) + 43))
select @idx = @idx + 1
select @rnd = rand()
end
declare @statement nvarchar(4000)
select @statement = N'CREATE APPLICATION ROLE [MyAppRole] WITH DEFAULT_SCHEMA = [dbo], ' + N'PASSWORD = N' + QUOTENAME(@randomPwd,'''')
EXEC dbo.sp_executesql @statement
GO
De toute évidence, cela n'est pas utile dans mon cas, même si cela fournit une méthode intéressante pour générer des mots de passe aléatoires.
Sur la base des réponses jusqu'à présent, j'ai créé une suggestion Connect pour ajouter une prise en charge de ce produit au produit: