2014-06-30 14 views
5

Utworzyłem procedurę przechowywaną na określonym schemacie.Jak nadać wykonanie określonej określonej procedurze przechowywanej do użytkownika

W tej procedurze przechowywanej chcę nadać uprawnienie wykonywania.

Więc napisałem, że:

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

Problemem jest to: Moja użytkownik może zobaczyć każdy procedury przechowywanej. Chciałbym, żeby widział tylko procedurę, w której ma uprawnienie EXECUTE.

Czy istnieje sposób, aby to osiągnąć?

Z góry dziękuję.

Odpowiedz

4

Tak ... To działa zgodnie z oczekiwaniami, jeśli nie przyznają użytkownikowi przywilej SELECT na stole mysql.proc, bezpośrednio albo pośrednio, na przykład z GRANT SELECT ON *.* TO ...

Bez SELECT pozwolenie na tej tabeli, użytkownik Widać tylko istnienie procedur składowanych i przechowywanych funkcji, w których mają inne uprawnienia, takie jak EXECUTE.

Pod maską brak SELECT na mysql.proc uniemożliwia również użytkownikowi zobaczenie procedur, do których nie ma dostępu za pomocą pseudo-stołu.

Nie powinieneś potrzebować GRANT SELECT ON mysql.proc, aby umożliwić użytkownikowi wykonywanie procedur lub funkcji ... a jeśli tak, to , że wydaje się pytanie.

+0

Wygląda na to, że to moja wtyczka spowodowała problem. Używam MySQLForExcel, aby umożliwić użytkownikom interakcję z DB. Masz rację, bez SELECT ON mysql.proc, mogę bez problemu wywoływać moje zapisane procedury. Ale MySQLForExcel nie zezwala na to z jakiegoś ukrytego powodu ... ** Nie można pobrać metadanych procedury składowanej dla procedury "truncate_t_qcms_lead_engineer". Albo nadaj temu użytkownikowi uprawnienia SELECT do mysql.proc, albo użyj "sprawdź parametry = fałsz" z łańcuchem połączenia. ** – TriGerZ

-1

Problem rozwiązany.

W rzeczywistości, aby móc wykonać procedurę przechowywaną w MySQLForExcel, musimy USTAWIĆ DEFINER każdej procedury przechowywanej, którą chcemy wywołać przez użytkownika 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

podziękować za pomoc.

+0

W rzeczywistości działa to z niewłaściwych powodów i może mieć wpływ na bezpieczeństwo. Prawidłowe rozwiązanie było prawdopodobnie zawarte w oryginalnym komunikacie o błędzie: w łańcuchu połączenia ODBC potrzebujesz wartości CheckParameters = false, aby wyłączyć awarię w ODBC, która spowodowała błąd. –

Powiązane problemy