Autorizzazioni utente incasinate a seguito di un'operazione di backup -> Ripristina


11

Ho dovuto spostare diversi database SQL Server 2008 sul nostro nuovo server db, quindi ho eseguito il backup di tutti (nei file .bak), copiato questi file nella nuova casella e ripristinati (tutti eseguiti utilizzando SQL Management Studio).

Tutto è andato bene, ma ora non riesco ad accedere a nessuno dei database utilizzando l'account SQL Server che continua a funzionare sul vecchio RDBMS. Il mio login autenticato con Windows funziona ancora per inciso.

Ho avuto questa idea che gli utenti e le autorizzazioni sarebbero stati perfettamente duplicati sul nuovo server di database, ma sembra che qualcosa sia andato storto da qualche parte. Gradirei commenti / suggerimenti / offerte di aiuto ;-)

Risposte:


7

Vedo che hai già trovato una soluzione al tuo problema, una cosa che ho notato nella tua domanda originale era che avevi ancora accesso al vecchio server.

La seguente domanda su SO ha avuto un problema simile e include collegamenti a un articolo Microsoft con uno script per generare le autorizzazioni utente.

/programming/461385/restoring-a-backup-to-a-different-server-user-permissions

(Risorsa elencata per quella domanda http://support.microsoft.com/kb/918992 )

Sembra che cambiare l'impostazione del server dall'autenticazione di Windows all'autenticazione in modalità mista abbia risolto il problema, ma nel caso in cui non abbia risolto completamente il problema ho pensato che potesse essere utile.


Sono sicuro che questa non sarà la prima volta che combatterò con SQL Server su utenti / autorizzazioni, quindi aggiungerò i segnalibri all'articolo per i posteri. Mille grazie per la pubblicazione.
5

6

Questo è noto come "utenti orfani". Ecco 2 modi per risolverlo

  1. Se possibile, ripristinare il database master originale come "loginsource" e sys.server_principals ha informazioni sufficienti per generare tutti gli accessi di SQL Server e Windows. Cioè, i SID e la password crittografata

  2. Se si utilizzano solo accessi Windows, è possibile eseguirlo per database per generare uno script

script:

SELECT
    'CREATE LOGIN [' + SUSER_SNAME(sid) + '] FROM WINDOWS'
FROM
    sys.database_principals
WHERE
    [type] IN ('G', 'U')

Grazie per la risposta: la mia app Web utilizza accessi SQL mentre i nostri account di Windows vengono utilizzati a fini amministrativi. Non riesco a vedere un modo per ripristinare come 'loginsource' come suggerisci - potresti per favore elaborare? Sto sperando che tutto questo può essere fatto utilizzando Management Studio?
5

PS. Ho seguito questo documento: support.microsoft.com/kb/274188 ed eseguito tutti gli script (apparentemente) con successo. Ma nulla è cambiato.
5

5

Idealmente, dovresti eseguire lo scripting degli utenti e delle autorizzazioni prima di eseguire il ripristino. Se ciò non è avvenuto, allora devi occuparti di sistemare le cose dopo il fatto, e le probabilità sono che ci mancherà qualcosa, ma dovresti essere in grado di ottenere circa il 90% del percorso.

La prima cosa che devi verificare è se esistono gli stessi accessi sul nuovo server. In caso contrario, dovresti scoprire se è giusto che gli accessi vengano creati sul nuovo server. Non dare mai per scontato che debbano essere creati, potrebbe esserci una buona ragione per cui in primo luogo non esistevano. Puoi quindi crearli scavando nella tabella sysusers.

Puoi correggere gli utenti orfani eseguendo qualcosa di simile al seguente:

DECLARE @username varchar(25), @loginsid varbinary(85)
DECLARE fixusers CURSOR
FOR
SELECT UserName = name 
    FROM sysusers
    WHERE issqluser = 1 
    and (sid is not null and sid <> 0x0)
    and suser_sname(sid) is null
    and name in (select name from master..syslogins)
    ORDER BY name
OPEN fixusers
FETCH NEXT FROM fixusers
INTO @username
WHILE @@FETCH_STATUS = 0
BEGIN
    EXEC sp_change_users_login 'update_one', @username, @username

    FETCH NEXT FROM fixusers
    INTO @username
END CLOSE fixusers
DEALLOCATE fixusers 

Questo codice funzionerà per SQL2008, ma è stato scritto per essere retrocompatibile per SQL2000.


Grazie per la sceneggiatura. Posso presumere che non ci sia modo di farlo in Management Studio? Inoltre, alcune persone stanno suggerendo di eliminare e ricreare gli utenti a livello di DB: è consigliato?
5

Ciò presuppone che gli accessi esistano già e che maturi solo i SID
gbn

sp_change_users_login non aggiorna il SID? msdn.microsoft.com/en-us/library/ms174378.aspx
SQLRockstar

5arx: non è possibile farlo in SSMS. Come ho già detto, in una situazione ideale avresti scritto le tue autorizzazioni prima del ripristino. A questo punto devi ricreare manualmente o provare a mettere insieme manualmente le cose. se fossi in te, ripristinerei il vecchio db, scrivo le autorizzazioni, eseguo il ripristino dall'altro server e quindi rifare le autorizzazioni.
SQLRockstar

"Update_One: collega l'utente specificato nel database corrente a un account di accesso di SQL Server esistente. È necessario specificare l'utente e l'accesso. La password deve essere NULL o non specificata." Quindi presuppone che gli accessi esistano già.
gbn


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.