IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MS SQL Server Discussion :

Assigner des droits sur une database


Sujet :

MS SQL Server

  1. #1
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut Assigner des droits sur une database
    Bonjour

    Il semble qu'assigner les droits sur une Database MS Sql soit un grand mystere que personne ne semble vraiment maitriser vu le peu de réponse sur le sujet.... voir :
    http://www.developpez.net/forums/d96...s/#post5425174

    Apres toutes les tribulation du topic ci-dessus, j'étais parvenu a attribuer un User ID; pwd et les droits nécessaire sur une DB
    Mais une autre DB issue d'un restore depuis un autre serveur restait récalcitrante

    La meilleure, c'est que aujourd'hui j'ai voulu faire une restore de la premiere DB (fonctionelle) a partir d'un back-up de l'autre serveur

    - Non sans mal car j'ai d'abord du effacer la DB existante pour effectuer le restore

    PATATRA j'ai perdus les droits (alors que sur l'autre serveur j'utilise le meme User ID et PWD)

    Je tente un restore (natif) de la DB que je viens d'effacer
    OUF je récupére les droits

    Je désespère un peu mais j'envisage maintenant une autre solution :

    Est-il possible de scripter les droits d'une DB afin de les réappliquer sur une autre DB ?

    Il y a-t-il par ici quelqu'un ayant suffisement de connaissance en la matiére pour pouvoir aider sur ce sujet ?

    Merci

  2. #2
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Et voilà j'ai trouvé la solution a ce problème

    En fait lors du restore, le user est recupéré mais il a perdu son Login.
    On parle d'un user "orphelin"

    La solution est ici

    http://www.fileformat.info/tip/micro...rphan_user.htm

    Et pratiquement il faut executer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    use [DbName];
    EXEC sp_change_users_login 'Auto_Fix', '[userName]'
    J'espère que cela pourra aider d'autre.
    (un forum sa sert a s'entraider et partager des connaissance ... Non ... ? )

  3. #3
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    Bonjour olibara,

    Ce problème de droit est classique lors d'un RESTORE d'une base sur un autre serveur. Je vous laisse faire une recherche dans le forum avec le mot clé "sp_change_users_login".

    Pourquoi faire cela donc ? Tout d'abord cette procédure n'est valable que pour les comptes de connexion de type SQL Server. Pour ceux-ci c'est SQL Server qui doit génère le SID qui permet de faire le lien entre un compte de connexion et un utilisateur de bases de données. Lors d'un RESTORE ce lien est brisé puisque sur l'autre serveur le compte de connexion équivalent n'aura pas le même SID. Cette procédure sert donc à refaire ce fameux lien.

    Pour un compte de connexion de type Windows, c'est le système d'exploitation qui est en charge de générer un SID unique pour un compte de connexion (je parle ici de compte de domaine active directory). Dans ce cas, lors d'une opération de restauration le lien entre l'utilisateur de bases de données et le compte de connexion n'est pas brisé (Le SID est unique pour un compte pour l'ensemble du domaine). Il y a quelques cas où il est nécessaire de faire quelques manipulations pour restaurer le lien (Une suppression accidentelle d'un compte de domaine par exemple). Je vous laisse lire ce billet qui explique comment y parvenir.

    ++

  4. #4
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Merci MikeDavem

    Mais puisque ce problème semble si classique, c'est dommage d'avoir du chercher si longtemps pour trouver la réponse meme en ayant posé plusieurs fois des questions s'y rapportant sur ce forum

    Et je ne pense pas que le mot clef "sp_change_users_login" puisse venir spontanément a l'esprit avant d'avoir déja trouvé la réponse.

    C'est donc une intuition soudaine et un peu de chance qui m'ont amené a verifier les login des user et un peu d'aide sur le forum Sql Team qui ma guidé vers le mot clef magique

    "Orphean user"

    http://www.fileformat.info/tip/micro...rphan_user.htm

  5. #5
    Membre Expert

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Août 2007
    Messages : 1 216
    Par défaut
    Bonjour,

    1) Si vous effectuez un restore avec l'option REPLACE, vous n'aurez pas a supprimer la base de donnee prealablement existante.
    Par contre il vous faudra couper les connections utilisateurs ouvertes sur la base car SQL Server pose un verrou exclusif sur la DB a restaurer.

    2) Ne confondez pas les droits et le lien entre database user et login server.
    Si vous restaurer une database DB1 sur un serveur A en la remplacant par la DB1 du serveur B, les droits des utilisateurs seront ceux de la DB1 du serveur B.

    3) Parfois un peu d'anglais et google peuvent servir:
    "link user and login after restore sql server" expose directement le probleme des utilisateurs orphelins.

    4) Scripter l'entierete des droits des utilisateurs/roles sur les differents objets d'une base de donnees n'est pas l'operation la plus simple... Il faut se referer aux tables systemes de SQL Serveur.
    Encore une fois google aide:
    http://vyaskn.tripod.com/scripting_p...erver_2005.htm
    Pour un script plus specifique, je vous invite a vous plonger dans le TSQL et le data modele des tables systeme de SQL Serveur.

    Bonne journee

  6. #6
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Merci Ptit_Dje

    1) Si vous effectuez un restore avec l'option REPLACE, vous n'aurez pas a supprimer la base de donnee prealablement existante.
    Oui j'avais déja vu cette option sur certains post mais je dois etre aveugle car je ne l'ai trouvé nulle part dans les options de restore sous Management Studio Express, meme en la cherchant bien . Cette option n'existe probablement pas sous EXPRESS

    Donc je dois d'abord effacer la base en local pour restaurer la base issue du backup d'un autre serveur (et ce n'est pas la première fois)

  7. #7
    Membre éclairé
    Homme Profil pro
    CMA-CGM
    Inscrit en
    Novembre 2005
    Messages
    531
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : CMA-CGM
    Secteur : Transports

    Informations forums :
    Inscription : Novembre 2005
    Messages : 531
    Par défaut
    Bonjour à tous...
    en llisant ce topic très interessant je me demande une chose :
    Lors d'un DETACH/ATTACH d'une database entre deux serveurs, les users de la database cible seront-ils 'orphelins' ? et faudra t'l les alterer ?

    Merci pour votre réponse....

  8. #8
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    Bonjour,

    Vous aurez à faire la même chose que pour une opération de restauration. (RESTORE)

    ++

  9. #9
    Membre éclairé
    Homme Profil pro
    CMA-CGM
    Inscrit en
    Novembre 2005
    Messages
    531
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : CMA-CGM
    Secteur : Transports

    Informations forums :
    Inscription : Novembre 2005
    Messages : 531
    Par défaut
    Ok mais dois-je en conclure qu'il faudra exécuter :
    EXEC sp_change_users_login 'Auto_Fix', 'user'
    sur tous les user de la database ?

  10. #10
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Citation Envoyé par genio Voir le message
    Ok mais dois-je en conclure qu'il faudra exécuter :

    sur tous les user de la database ?
    A mon avis oui !
    Attendons voir si un guru daignera donner une pincée d'information

  11. #11
    Membre Expert

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Août 2007
    Messages : 1 216
    Par défaut
    Oui, sur tous les users qui sont normalement lies a un login de type SQL server.
    Pour les autres, le SID devrait correspondre avec le SID de l'AD comme explique par Mikedavem.

    NB: il y a pas de guru ici, juste des benevoles au service des gens

  12. #12
    Membre éclairé
    Homme Profil pro
    CMA-CGM
    Inscrit en
    Novembre 2005
    Messages
    531
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : CMA-CGM
    Secteur : Transports

    Informations forums :
    Inscription : Novembre 2005
    Messages : 531
    Par défaut
    Ok merci à vous...
    Je supprose que les logins genre : processadmin, ##MS_SQLResourcetoto..., dbcréator voire diskadmin doivent être des logins 'internes sql server' car ils n'ont pas de correspondance avec les users de la table sysusers....
    Comment reconnaître un user Sql/server de gestion d'une database ?
    Sont-ce ceux 'jointables' entre la table sys.sysusers et sys.sever_principal avec le login name et le user name ?
    Y a t'il une autre façon de voir ça ?

    J'espère que je suis clair !

  13. #13
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2003
    Messages : 733
    Billets dans le blog
    8
    Par défaut
    Juste une précision par rapport à la syntaxe :

    La commande exec sp_change_users_login … est indispensable sous SQL server 2000

    Mais à partir de Sql Server 2005 et supérieure la syntaxe exec sp_change_users_login est encore valable mais considérée déprécié (Deprecated) et Microsoft alerte sur la suppression de cette commande dans une prochaine version.

    Donc à partir de SQL Server 2005, utilisez en lieu et place la commande ALTER USER ..
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ALTER USER userName  WITH NAME = NewUserName,  /* nouveau nom : vous pouvez ici changer le nom de l'utilisateur de la base de données*/ 
                         DEFAULT_SCHEMA = dbo, 
                         LOGIN = loginName
    PS : Cela, pour ceux qui ne l’auraient pas déjà lu, est déjà mentionné et dans bilet de mikedavem (ici)

  14. #14
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Citation Envoyé par hmira Voir le message
    Juste une précision par rapport à la syntaxe :

    La commande exec sp_change_users_login … est indispensable sous SQL server 2000

    Mais à partir de Sql Server 2005 et supérieure la syntaxe exec sp_change_users_login est encore valable mais considérée déprécié (Deprecated) et Microsoft alerte sur la suppression de cette commande dans une prochaine version.

    Donc à partir de SQL Server 2005, utilisez en lieu et place la commande ALTER USER ..
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ALTER USER userName  WITH NAME = NewUserName,  /* nouveau nom : vous pouvez ici changer le nom de l'utilisateur de la base de données*/ 
                         DEFAULT_SCHEMA = dbo, 
                         LOGIN = loginName
    PS : Cela, pour ceux qui ne l’auraient pas déjà lu, est déjà mentionné et dans bilet de mikedavem (ici)
    Quand on regarde le code de Sp_Change_user_login et spécifiquement la commande Auto_Fix, je doute que le simple ALTER mentioné puiisse sufire !
    Cela etant, le billet de MikeDavem permet effectivemant de comprendre comment faire la manip "a la main"

    Code Sp_Change_user_login : 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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    USE [master]
    GO
    /****** Object:  StoredProcedure [sys].[sp_change_users_login]    Script Date: 08/25/2010 22:52:52 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER procedure [sys].[sp_change_users_login]
        @Action               varchar(10)       -- REPORT / UPDATE_ONE / AUTO_FIX
       ,@UserNamePattern      sysname  = Null
       ,@LoginName            sysname  = Null
       ,@Password             sysname  = Null
    AS
        -- SETUP RUNTIME OPTIONS / DECLARE VARIABLES --
    	set nocount on
    	declare @exec_stmt nvarchar(4000)
     
    	declare @ret            int,
                @FixMode        char(5),
                @cfixesupdate   int,        -- count of fixes by update
                @cfixesaddlogin int,        -- count of fixes by sp_addlogin
                @dbname         sysname,
                @loginsid       varbinary(85),
                @110name        sysname,
                @ActionIn       varchar(10),
                @sanitizedPwd sysname -- We use this to pass on the password parameter down to SetSID
     
        -- SET INITIAL VALUES --
        select  @dbname         = db_name(),
                @cfixesupdate   = 0,
                @cfixesaddlogin = 0,
                @ActionIn = @Action,
                @Action = UPPER(@Action collate Latin1_General_CI_AS)
     
        -- set the sanitized password to NULL - we do not want to give any information about this parameter in eventdata
        set @sanitizedPwd = NULL
     
     
        -- INVALIDATE USE OF SPECIAL LOGIN/USER NAMES --
        if suser_sid(@LoginName) = 0x1 -- 'sa'
        begin
            raiserror(15287,-1,-1,@LoginName)
            return (1)
        end
        if database_principal_id(@UserNamePattern) in (0,1,2,3,4) --public, dbo, guest, INFORMATION_SCHEMA, sys
        begin
            raiserror(15287,-1,-1,@UserNamePattern)
            return (1)
        end
     
        -- HANDLE REPORT --
        if @Action = 'REPORT'
        begin
     
            -- CHECK PERMISSIONS --
            if not is_member('db_owner') = 1
            begin
    		raiserror(15247,-1,-1)
                	return (1)
            end
     
            -- VALIDATE PARAMS --
            if @UserNamePattern IS NOT Null or @LoginName IS NOT Null or @Password IS NOT Null
            begin
                raiserror(15600,-1,-1,'sys.sp_change_users_login')
                return (1)
            end
     
            -- GENERATE REPORT --
            select UserName = name, UserSID = sid from sysusers
                where issqluser = 1 
                and   (sid is not null and sid <> 0x0)
                and   (len(sid) <= 16)
                and   suser_sname(sid) is null
                order by name
            return (0)
        end
     
       -- ERROR IF IN USER TRANSACTION --
        if @@trancount > 0
        begin
            raiserror(15289,-1,-1)
            return (1)
        end
     
        -- HANDLE UPDATE_ONE --
        if @Action = 'UPDATE_ONE'
        begin
            -- CHECK PERMISSIONS --
            if not is_member('db_owner') = 1
            begin
    			EXEC %%System().AuditEvent(ID = 1196184405, Success = 0, TargetLoginName = @LoginName, TargetUserName = @UserNamePattern, Role = NULL, Object = NULL, Provider = NULL, Server = NULL)
    			raiserror(15247,-1,-1)
                return (1)
            end
            else
            begin
    			EXEC %%System().AuditEvent(ID = 1196184405, Success = 1, TargetLoginName = @LoginName, TargetUserName = @UserNamePattern, Role = NULL, Object = NULL, Provider = NULL, Server = NULL)
            end
     
            -- ERROR IF PARAMS NULL --
            -- OR IF A PASSWORD IS SPECIFIED --
            if @UserNamePattern IS Null or @LoginName IS Null or @Password IS NOT Null
            begin
                raiserror(15600,-1,-1,'sys.sp_change_users_login')
                return (1)
            end
     
            -- VALIDATE PARAMS --
            -- Can ONLY remap SQL Users to SQL Logins!  Should be no need
            --  for re-mapping NT logins, and if you try, you'll mess up
            --  the user status bits! 
            if not exists 
            	(select name 
            	 from   sysusers 
            	 where  name = @UserNamePattern		-- match user name
                 and    issqluser = 1               -- must be sql user
                 and    sid is not NULL
                 and    len(sid)  <= 16)				-- must not be a sql-user for the database
            begin
                raiserror(15291,-1,-1,'User',@UserNamePattern)
                return (1)
            end
     
    		if exists (select * from sys.server_principals where
    						name = @LoginName              -- match login name
    						and type in ('C', 'K'))        -- check if it is a certificate or asymmetric key login
    		begin
    		    raiserror(15291,-1,-1,'login', @LoginName)
                return (1)
    		end
     
    		BEGIN TRANSACTION
     
    		-- LOCK USER --
    		EXEC %%Owner(Name = @UserNamePattern).Lock(Exclusive = 1) -- may fail, back out below
    		if @@error = 0
    			select @loginsid = sid from master.dbo.syslogins where
    				    loginname = @LoginName              -- match login name
    				and isntname = 0                        -- cannot use nt logins
            if @loginsid is null
            begin
    			ROLLBACK TRANSACTION
                raiserror(15291,-1,-1,'Login',@LoginName)
                return (1)
            end
     
            -- CHANGE THE USERS LOGIN (SID) - IF DUP, @@ERROR WILL INDICATE --
    		EXEC %%UserOrGroup(Name = @UserNamePattern).SetSID(SID = @loginsid,
    			IsExternal = 0, IsGroup = 0,
    			Action = @Action, UserNamePattern = @UserNamePattern, LoginName = @LoginName, Password = @sanitizedPwd) -- may fail
     
            -- FINALIZATION: REPORT (ONLY IF NOT SUCCESSFUL) AND EXIT --
            if @@error <> 0
    		begin
    			ROLLBACK TRANSACTION
    		    raiserror(15063,-1,-1)
    		    return (1)
            end
     
    		COMMIT TRANSACTION
            return (0)
        end
     
        -- ERROR IF NOT AUTO_FIX --
        if @Action <> 'AUTO_FIX'
        begin
            raiserror(15286,-1,-1,@ActionIn)
            return (1)
        end
     
        -- HANDLE AUTO_FIX --
        -- CHECK PERMISSIONS --
        if not is_srvrolemember('sysadmin') = 1
        begin
    		EXEC %%System().AuditEvent(ID = 1178686293, Success = 0, TargetLoginName = NULL, TargetUserName = @UserNamePattern, Role = NULL, Object = NULL, Provider = NULL, Server = NULL)
            raiserror(15247,-1,-1)
            return (1)
        end
        else
        begin
    		EXEC %%System().AuditEvent(ID = 1178686293, Success = 1, TargetLoginName = NULL, TargetUserName = @UserNamePattern, Role = NULL, Object = NULL, Provider = NULL, Server = NULL)
        end
     
        -- VALIDATE PARAMS --
        if @UserNamePattern IS Null or @LoginName IS NOT Null
        begin
    		raiserror(15600,-1,-1,'sys.sp_change_users_login')
            return (1)
        end
     
        -- LOOP THRU ORPHANED USERS --
    	select @exec_stmt = 'declare ms_crs_110_Users cursor global for
                select name from sysusers
                where name = N' + quotename( @UserNamePattern , '''')+ '
                and   issqluser = 1 
                and   sid is not NULL
                and   len(sid) <= 16
                and   suser_sname(sid) is null'
        EXEC (@exec_stmt)
        open ms_crs_110_Users
        fetch next from ms_crs_110_Users into @110name
     
        while (@@fetch_status = 0)
        begin
       		if exists (select * from sys.server_principals where
    						name = @110name              -- match login name
    						and type in ('C', 'K'))            -- check if it is a certificate or asymmetric key login
    		begin
    			raiserror(15291,-1,-1, 'login', @110name)
    			deallocate ms_crs_110_Users                
           	    return (1)
           	end
     
            -- IS NAME ALREADY IN USE? --
    		if not exists(select * from master.dbo.syslogins where loginname = @110name)
            begin
    			-- VALIDATE PARAMS --
    			if @Password IS Null
    			begin
    				raiserror(15600,-1,-1,'sys.sp_change_users_login')
    				deallocate ms_crs_110_Users                
    				return (1)
    			end
     
                -- ADD LOGIN --
                EXEC @ret = sys.sp_addlogin @110name, @Password, @dbname
                if @ret <> 0 or suser_sid(@110name) is null
                begin
                    raiserror(15497,16,1,@110name)
                    deallocate ms_crs_110_Users
                    return (1)
                end
                select @FixMode = '1AddL'
                raiserror(15293,-1,-1,@110name)
            end
            else
            begin
                -- REPORT ERROR & CONTINUE IF DUPLICATE SID IN DB --
                select @FixMode = '2UpdU'
                raiserror(15292,-1,-1,@110name)
            end
     
            select @loginsid = suser_sid(@110name)
            if not exists (select * from sysusers where sid = @loginsid)
            begin
    			-- LOCK USER --
    			BEGIN TRANSACTION
    			EXEC %%Owner(Name = @110name).Lock(Exclusive = 1)
    			-- UPDATE SYSUSERS ROW --
    			if @@error = 0
    			begin
    				EXEC %%UserOrGroup(Name = @110name).SetSID(SID = @loginsid,
    						IsExternal = 0, IsGroup = 0,
    						Action = @Action, UserNamePattern = @UserNamePattern, LoginName = @LoginName, Password = @sanitizedPwd) -- may fail
    				if @@error <> 0
    				begin
    					ROLLBACK TRANSACTION
    					deallocate ms_crs_110_Users
    					raiserror(15063,-1,-1)
    					return (1)
    				end
    			end
    			COMMIT TRANSACTION
     
    			if @FixMode = '1AddL'
    				select @cfixesaddlogin = @cfixesaddlogin + 1
    			else
    				select @cfixesupdate = @cfixesupdate + 1
    		end
    		else
    			raiserror(15331,-1,-1,@110name)
     
    	    fetch next from ms_crs_110_Users into @110name
        end -- loop
    	close ms_crs_110_Users
        deallocate ms_crs_110_Users
     
        -- REPORT AND RETURN SUCCESS --
        raiserror(15295,-1,-1,@cfixesupdate)
        raiserror(15294,-1,-1,@cfixesaddlogin)
        return (0) -- sp_change_users_login

  15. #15
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2003
    Messages : 733
    Billets dans le blog
    8
    Par défaut
    - L’utilisation Auto_fix facilite la tâche, puisqu’elle crée automatiquement le login et le mappage login / user, mais le revers de la médaille c'est que Auto_fix est déconseillé et ne va pas dans le sens de la sécurité puisqu’il crée à la volée des logins !
    - De toute façon la commande sp_change_users_login est obsolète et sera peut être supprimée dans une prochaine version de SQL server.
    - Je crois par ailleurs, qu’il n’y a pas l’équivalent de Auto_fix dans la nouvelle syntaxe ALTER USER. Le login doit être préalablement crée en toute connaissance de cause avant de faire les mappages user / login avec ALTER USER

    A+

  16. #16
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    L’utilisation Auto_fix facilite la tâche, puisqu’elle crée automatiquement le login et le mappage login / user
    Je pense plutot que AutoFix ne cree pas de Login mais restaure le Mappage entre un User Orphelin et un Login Existant

    Peut etre que la bonne (future) commande serait un "Rebind User"

  17. #17
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2003
    Messages : 733
    Billets dans le blog
    8
    Par défaut
    Fais le test pour t'en convaincre :
    1 – Tu crée un login login01 (avec authentification SQL Server) ayant le mot de passe pwd01
    2 – Sélectionne une base donnée (n’importe laquelle) MaBase, puis crée un nouvel utilisateur de base de données user01 mappé sur le login login01

    3 – Sélectionne le Serveur puis supprime le login01 (l’utilisateur user01 est désormais orphelin)

    4 – lance la commande ci-dessous
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Use MaBase 	
    EXEC sp_change_users_login 'Auto_Fix', 'user01', NULL, 'pwd2';
    5 – Vérifie au niveau serveur de base de données la liste des login (appuis sur la touche F5 pour rafraichir la liste des login)

    Tu verras l’effet de l’action ‘Auto_Fix’ :
    Tu verras un nouveau login user01 qui va apparaitre dans liste des login !
    Le nouveau login user01, crée à la volée, a pour mot de passe pwd2 ; il est mappé sur l’utilisateur de base de données user01 de la base de données MaBase.

    A+

  18. #18
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Pour hmira

    Certe !
    Sauf que dans ton exemple tu a un peu triché sur la situation que j'exposais

    Lors d'un restore il ne s'agit pas d'avoir suprimé un login sur le nouveau serveur

    Mais du User d'une base qui n'a pas été pas attaché au Login existant ayant le nom d'origine

  19. #19
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2003
    Messages : 733
    Billets dans le blog
    8
    Par défaut
    Je ne me référais pas à la situation initiale, je parlais d’une manière générale de la commande sp_change_users_login , de l’action 'Auto_Fix' et de ses effets.

    Sinon, tu as très bien fait d’exposer le problème initial. En effet, on a tous été confronté à ce problème et cela peut servir à d’autres.

    A+

Discussions similaires

  1. Attribution des droits sur une Database
    Par olibara dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 29/05/2011, 11h56
  2. pgAdmin : créer un rôle et lui affecter des droits sur une base
    Par jmnicolas dans le forum Administration
    Réponses: 1
    Dernier message: 14/10/2010, 11h47
  3. Réponses: 7
    Dernier message: 18/07/2010, 18h27
  4. Mettre en place des droits sur une vue différents de ceux de la table-source ?
    Par Antoun dans le forum Administration et Installation
    Réponses: 14
    Dernier message: 15/02/2010, 14h13
  5. [MySQL] Perte des droits sur une table ??
    Par Mystic eyes dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 05/07/2006, 16h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo