2014-06-30 18 views
5

Ho creato alcune stored procedure su uno schema specifico.Come concedere l'esecuzione su una stored procedure specifica all'utente

In questa stored procedure, voglio concedere il privilegio di esecuzione.

Così ho scritto che:

GRANT EXECUTE ON PROCEDURE schema_name.proc_name TO 'user_name'; 
GRANT SELECT ON mysql.proc to 'user_name'; 

Il problema è: Il mio utente può vedere ogni stored procedure. Vorrei che potesse vedere solo la procedura in cui ha il privilegio ESEGUI.

C'è un modo per farlo?

Grazie in anticipo.

risposta

4

Sì ... questo funziona come previsto se non si concede all'utente la SELECT privilegio sul tavolo mysql.proc, direttamente o indirettamente, come ad esempio con GRANT SELECT ON *.* TO ...

Senza SELECT permessi su questo tavolo, un utente può solo vedere l'esistenza di stored procedure e funzioni memorizzate dove hanno altre autorizzazioni, come EXECUTE.

Sotto il cofano, la mancanza di SELECT su mysql.proc impedisce inoltre all'utente di visualizzare le procedure a cui non ha accesso tramite la pseudo-tabella information_schema.routines.

Non è necessario il GRANT SELECT ON mysql.proc per consentire all'utente di eseguire procedure o funzioni ... e se lo fai, quindi che sembra la domanda.

+0

In effetti, sembra che sia il mio plugin a causare il problema. Sto usando MySQLForExcel per consentire agli utenti di interagire con il DB. Hai ragione, senza SELECT ON mysql.proc, posso chiamare le mie stored procedure senza problemi. Ma MySQLForExcel non lo consente per qualche motivo oscuro ... ** Impossibile recuperare i metadati della stored procedure per la routine 'truncate_t_qcms_lead_engineer'. Assegna il privilegio SELECT a mysql.proc per questo utente o utilizza "controlla parametri = falso" con la stringa di connessione. ** – TriGerZ

-1

Problema risolto.

Infatti, per poter eseguire la stored procedure all'interno di MySQLForExcel, è necessario impostare il DEFINER di ciascuna stored procedure che si desidera venga chiamata da un utente MySQLForExcel.

DELIMITER $$ 

DROP PROCEDURE IF EXISTS `procedure_name` $$ 
CREATE DEFINER=`user_mysqlforexcel` PROCEDURE `procedure_name`(param) 
BEGIN 
    Do smth as usual 
END $$ 

I found that here

Grazie per l'aiuto.

+0

In realtà, questo funziona per i motivi sbagliati e potrebbe avere implicazioni sulla sicurezza. La soluzione corretta era probabilmente nel messaggio di errore originale: è necessario che CheckParameters = false nella stringa di connessione ODBC disabiliti la violazione in ODBC che causava l'errore. –