Bonjour,
J'ai une procédure stockée qui me créée un login et un utilisateur. Cette procédure utilise du SQL dynamique, j'utilise donc la commande WITH EXECUTE AS OWNER pour que les droits ne soit pas vérifiés au niveau de l'utilisateur qui l’exécute.
L'utilisateur qui a créé la procédure possède le rôle au niveau server sysadmin.
Mon problème est que l'orsque que je regarde le propriétaire de la procédure il est indiqué dbo et non le nom de mon utilisateur ou sysadmin... qui possède le privilègede création de login. La procédure me retourne un message d'erreur :L'utilisateur n'est pas autorisé à effectuer cette action.
Avez vous une idée?
En résumé ma question est comment éxécuter cette procédure stockée sans avoir le privilège server sysadmin?
Code : 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
48
49
50
51
52
53
54
55 ALTER PROCEDURE [dbo].[P_CREATE_NEW_USER] @NAME nvarchar(50) WITH EXECUTE AS OWNER AS DECLARE @SQLStatement nvarchar(255) SET NOCOUNT ON SET TRANSACTION ISOLATION LEVEL SERIALIZABLE BEGIN TRANSACTION CREATE_NEW_USER BEGIN IF NOT EXISTS (SELECT name FROM master.sys.server_principals WHERE name = 'CNX_'+rtrim(@NAME)) BEGIN SET @SQLStatement = 'CREATE LOGIN CNX_'+rtrim(@NAME)+' WITH PASSWORD = '''+rtrim(@NAME)+'''' Exec (@SQLStatement) print (@SQLStatement) END IF NOT EXISTS (SELECT name FROM sys.database_principals WHERE name = rtrim(@NAME)) BEGIN SET @SQLStatement = 'CREATE USER '+rtrim(@NAME)+' FROM LOGIN CNX_'+rtrim(@NAME) Exec (@SQLStatement) print (@SQLStatement) END IF @@ERROR <> 0 BEGIN GOTO LBL_ERROR RETURN END END COMMIT TRANSACTION CREATE_NEW_USER RETURN LBL_ERROR: ROLLBACK TRANSACTION CREATE_NEW_USER RETURN
La seule piste que j'ai trouvé parle de certificat en signant la procédure stocké mais je ne comprend pas...
Partager