Bonjour,

Je travaille sur un site extranet.
J'ai des utilisateurs "internes" (salariés de l'entreprise) et des utilisateurs "externes" (clients, fournisseurs, partenaires).

J'ai décidé de faire en sorte que l'application web se connecte à la base de données avec un compte dédié à chaque utilisateur.

Un utilisateur "interne" peut créer un compte pour un autre utilisateur (interne ou externe).
Un niveau de droit plus fin sera mis en place dans l'application elle-même, au niveau base de données on va partir du principe que c'est suffisant pour le moment (puisqu'on les utilisateurs créés ne peuvent qu'exécuter des procédures stockées qui gèrent ces droits, sans accéder directement aux tables)

J'ai donc créé deux rôles "interne" et "externe", ainsi qu'une procédure stockée "createPerson", que les utilisateurs peuvent lancer.

Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
 
use mabase;
go
 
CREATE ROLE interne;
GRANT EXECUTE TO interne;
GRANT ALTER ANY USER TO interne;
--EXEC sp_addrolemember 'securityadmin', interne; // La je suis embêté, je ne sais pas comment autoriser le rôle "INTERNE" de ma base à créer des logins sur le serveur...
GO
 
CREATE ROLE externe;
GRANT EXECUTE TO externe;
GO
 
create procedure dbo.CreatePerson
(
    @person_id int output,
	@person_email varchar(256),
    @person_name varchar(50),
	@person_internal bit,
	@user_name nvarchar(128),
    @user_password varchar(50)
)
as
begin
	declare @user_uid smallint;
 
	execute('CREATE LOGIN mydb_' + @user_name + ' WITH PASSWORD = ''' + @user_password + '''');
	execute('CREATE USER ' + @user_name + ' FOR LOGIN mydb_' + @user_name + ' WITH DEFAULT_SCHEMA = dbo');
 
	select @user_uid = u.[uid]
	from sys.sysusers u
	where u.[name] = @user_name and u.islogin = 1;
 
	if (@person_internal = 1)
	begin
		exec sp_addrolemember 'interne', @user_name;
	end
	else
	begin
		exec sp_addrolemember 'externe', @user_name;
	end;
 
    insert into dbo.person (email, [name], user_uid)
    values (@person_email, @person_name, @user_uid);
end;
go

Comme en témoigne la ligne en commentaire sur la création du rôle "INTERNE", je ne sais pas comment faire pour octroyer le droit de créer des logins sur le serveur à mon rôle de base de données.

Une suggestion ?