6

Ho appena eseguito la migrazione da SQL2000 a SQL2008 e ho iniziato a ricevere un problema di autorizzazione di esecuzione su un processo memorizzato che utilizza sp_OACreate.Il server SQL esegue il permesso; mancata applicazione delle autorizzazioni

Il resto del sistema funziona correttamente con il login db che è stato impostato e aggiunto al database.

ho provato:

USE master 
GO 
GRANT EXEC ON sp_OACreate TO [dbuser] 
GO 

Ma questo non riesce con il seguente errore:

Msg 15151, Level 16, State 1, Line 1 Cannot find the user 'dbuser', because it does not exist or you do not have permission.

ho effettuato l'accesso al server come sa con autorizzazioni complete. Posso eseguire un'istruzione sql simile e applicare le autorizzazioni a un ruolo del server, ma non un login/utente.

Come si applicano le modifiche all'utente/accesso specifico?

Posso applicare le autorizzazioni al ruolo pubblico e risolve il problema; tuttavia questo mi sembra un problema di sicurezza che non desidero realmente applicare al server live.

risposta

5

All'inizio della risposta di John ho controllato le voci utente nel database Master e il mio utente non era presente. Se fosse stato cancellato o perso un po 'come non lo so.Qualcosa potrebbe essere impazzito con la migrazione dei dbs alla nuova istanza del server.

In ogni caso; ricreare l'utente e associarlo allo specifico login mi ha permesso di eseguire le seguenti istruzioni sul database master per consentire l'esecuzione dei proc memorizzati.

USE MASTER 
GO 

GRANT EXECUTE ON [sys].[sp_OADestroy] TO [dbuser] 
GO 
GRANT EXECUTE ON [sys].[sp_OACreate] TO [dbuser] 
GO 
GRANT EXECUTE ON [sys].[sp_OAMethod] TO [dbuser] 
GO 
GRANT EXECUTE ON [sys].[sp_OASetProperty] TO [dbuser] 
GO 

Grazie per tutto l'aiuto e i suggerimenti. Spero che questo aiuti le altre persone in futuro.

+0

Come hai migrato i tuoi database? Se non si è anche ripristinato il database master, l'utente "dbuser" non sarebbe stato presente e quindi non mappato. –

+0

@ John - Hai ragione. Il ripristino del database master non è stato eseguito a causa di alcuni bit e bob storici che volevamo evitare durante la migrazione. Sfortunatamente abbiamo anche perso gli utenti che ora vengono ricreati e mappati agli accessi :-) – WestDiscGolf

1

Verificare se l'utente dispone delle autorizzazioni per il database che si utilizza. È possibile farlo da Security -> Logins -> Select User e aprire la finestra delle proprietà. Quindi selezionare "User Mapping" dal menu di destra. Ora controlla i database a cui vuoi che l'utente abbia accesso. Successivamente selezionare dalla parte inferiore della finestra "Appartenenza al ruolo del database" e controllare "db_owner". Ora l'utente sarà il proprietario del database e sarà in grado di eseguire query, procedure di archiviazione e così via.

UPDATE:
aggiungere l'utente per il database selezionando il database -> Sicurezza -> utenti -> tasto destro "New User"
oppure è possibile utilizzare questa query

CREATE LOGIN AbolrousHazem 
    WITH PASSWORD = '340$Uuxwp7Mcxo7Khy'; 
USE AdventureWorks2008R2; 
CREATE USER AbolrousHazem FOR LOGIN AbolrousHazem; 
GO 

Qui ci sono ulteriori dettagli http://msdn.microsoft.com/en-us/library/ms173463.aspx

+0

Grazie per la risposta. Il ruolo db_owner per l'utente è impostato sul database. Ho provato ad aggiungere le autorizzazioni di esecuzione specifiche al ruolo db_owner e viene visualizzato il seguente messaggio di errore "Impossibile concedere, negare o revocare autorizzazioni ao da ruoli speciali." – WestDiscGolf

+0

Controlla se hai un utente collegato al tuo database. Sembra che tu abbia solo il login ma non l'utente. – Thea

+0

questo sembra essere il caso; Ho aggiunto una risposta a ciò che ho fatto per risolvere il problema. Grazie per l'aiuto :-) – WestDiscGolf

2

Il tuo problema potrebbe essere correlato agli utenti orfani.

Prova

USE MASTER 
GO 
EXEC sp_change_users_login 'Report' 

Questo restituirà una riga per ogni nome utente orfani. Quindi,

EXEC sp_change_users_login 'Update_One', 'dbuser', 'dbuser' 
+0

Grazie per la risposta. Ho eseguito il primo comando sul server e nessun record viene restituito dalla query. – WestDiscGolf

+0

Grazie per il punto nell'aiuto nella giusta direzione. +1 :-) – WestDiscGolf

4

L'errore indica che l'utente "dbuser" non esiste nel database master.

Presumo che l'utente esista all'interno del database principale?

È possibile controllare utilizzando il seguente T-SQL

USE MASTER; 
GO 

SELECT * 
FROM sys.sysusers 
WHERE name = 'dbuser' 

Se l'utente risulta non esistere, è sufficiente utilizzare l'istruzione CREATE USER e creare un utente chiamato "dbuser". L'utente verrà automaticamente associato a un Login con lo stesso nome, a condizione che ne esista uno.

+0

Grazie per la risposta. No, non esiste nella tabella sysusers. Come può essere aggiunto di nuovo? – WestDiscGolf

+0

Ok, ha aggiunto nuovamente l'utente e l'ha associato all'accesso dbuser. Ho quindi applicato le autorizzazioni di concessione all'utente. :-) – WestDiscGolf

+0

@WestDiscGolf: Ottime notizie, felice di aiutare. –

2

Ecco il codice che sto utilizzando il verificare che (utente corrente) ha Esecuzione per sp_OACreate ecc:

use master; 
select state_desc,name from 
sys.database_permissions a 
left join 
sys.all_objects b 
on a.major_id = b.object_id 
where name like 'sp_OA%'; 

Come sottolineato da @ John Sansom e @WestDiscGolf l'utente deve esistere nel Il database master e i diritti di esecuzione devono essere concessi nel database master, quindi è richiesto use Master. La query sopra restituirà i record se l'utente ha le autorizzazioni di esecuzione e il set vuoto se non lo fanno. (L'esecuzione nel database utente restituirà anche il set vuoto.)

Non riuscivo a capire come controllare queste autorizzazioni usando fn_my_permissions, che è presumibilmente lo strumento giusto per lavori come questo.

Problemi correlati