Chyba: User, group, or role already exists in the database

PříspěvekNapsal: 11.05.2012 22:36
od jiri.dolezal
Při snaze o přidání uživatele do databáze pomocí akce Přidat do databáze v seznamu uživatelů se můžete setkat s chybovou hláškou:

[SQL:15023,16] User, group, or role 'muj_login' already exists in the current database.

Zároveň je v seznamu uživatelů u problémového uživatele zaškrtnuto jak ve sloupci S (Je uživatel definován na SQL-serveru ?), tak ve sloupci D (Přístup do databáze ?). Snaha o přihlášení uživatele, ale končí chybou:

Uživatel nemá přístup do databáze !

Tato situace je způsobena tím, že uživateli v databázi není přiřazen příslušný login na SQL Serveru.

Může nastat z různých příčin (způsobených zásahem mimo aplikaci Helios Orange). Nejčastěji při obnově databáze na jiném SQL Serveru (např. při migraci), kdy nedojde ke korektnímu přiřazení uživatelů v databázi, kteří nemají na SQL Serveru definován login, prostřednictvím programu a loginy jsou definovány ručně, např. v Management Studiu.

Řešení pomocí programu:
Smazat login na SQL serveru akcí Smazat z SQL Serveru v seznamu uživatelů. Následně spustit program (s kontrolou konzistence) a nechat založit login programem.

Řešení pomocí skriptu:

Kód: Vybrat vše
--(i) skript spustit v příslušné databázi
--(i) muj_login zaměnit za login problémového uživatele
--(i) jméno uživatele i loginu uzavřete do hranatých závorek

ALTER USER [muj_login]   
      WITH LOGIN = [muj_login];

Hromadné přiřazení uživatelů a loginů

PříspěvekNapsal: 18.10.2013 13:13
od jiri.dolezal
Pro hromadné přiřazení uživatelů v databázi, kteří nemají (a dříve měli) na sebe navázaný žádný login na SQL serveru lze použít následující skript:

Kód: Vybrat vše
DECLARE @Name sysname;
DECLARE @Exec NVARCHAR(MAX);
DECLARE @ErrorMessage NVARCHAR(4000);
DECLARE @OsamelyLogin TABLE(
   [name] sysname NOT NULL
   ,[sid] varbinary(85) NULL
   );

/* funkční tělo procedury */
-- naplníme tabulku osamělých
INSERT INTO @OsamelyLogin
EXEC sp_change_users_login 'report';

-- procházíme osamělé namapujeme je na login
DECLARE OsamelyCur CURSOR LOCAL FAST_FORWARD FOR
   SELECT [name] FROM @OsamelyLogin;
OPEN OsamelyCur;
FETCH NEXT FROM OsamelyCur INTO @Name;
   WHILE (@@FETCH_STATUS = 0) AND (@@ERROR = 0)
   BEGIN
      -- zacatek akce v kurzoru OsamelyCur
      
      IF NOT EXISTS(SELECT * FROM sys.server_principals WHERE type IN ('S','U') AND name = @Name)
         PRINT (N'Login ' + @Name + N' není definován na SQL Serveru');
      ELSE
         BEGIN
            
            BEGIN TRY
               SET @Exec = N'ALTER USER ' + QUOTENAME(@Name) + N' WITH LOGIN = ' + QUOTENAME(@Name);
               EXEC (@Exec);
            END TRY
            BEGIN CATCH
               SELECT @ErrorMessage = ERROR_MESSAGE();
               PRINT (@Name + N' - chyba - ' + @ErrorMessage)
            END CATCH;
         
         END;
   
      -- konec akce v kurzoru OsamelyCur
   FETCH NEXT FROM OsamelyCur INTO @Name;
   END;
CLOSE OsamelyCur;
DEALLOCATE OsamelyCur;