2012-06-15 2 views
1

Я создал хранимую процедуру myProc в базе данных MySQL. Затем я отбросил эту процедуру. Я хочу снова создать процедуру с тем же именем. Я снова создаю процедуру и назову ее «myProc».Создание хранимой процедуры снова в MySQL DB

CALL myProc(); 

Но, когда я выполнить эту процедуру, это ошибка, как этот "PROCEDURE myProc does not exit". Также код аналогичен предыдущему.

+2

ли 'SHOW STATUS PROCEDURE;', что это говорит? –

+0

Я предполагаю, что 'call mypro()' это опечатка? пожалуйста, позаботьтесь о том, чтобы вставить то, что у вас есть, и не перепечатывать, так что проще найти реальные опечатки или опечатки только на SO :) – Nanne

+0

Образца нигде не хватает, чтобы воспроизвести проблему. [Пример кода] (http://sscce.org/) должен быть полным, кратким и представительным. – outis

ответ

1

Невозможно вызвать хранимую процедуру в MySQL

Вы создали процедуру в MySQL 5. Вы предоставившей EXECUTE привилегии учетной записи пользователя вашего приложения. Но когда ваше приложение готовит оператор для вызова этой процедуры, генерируется исключение. Возможно, это исключение NullPointerException внутри ConnectorJ. Возможно, исключение утверждает, что процедура не существует. Или, может быть, вам посчастливилось получить исключение, которое приведет вас к правильному пути (драйвер требует, чтобы объявление процедуры содержало «\ nbegin» или «\ n» для последующего объявления аргумента или привилегии SELECT на mysql.proc для разбора типов столбцов). Ниже приведены шаги по устранению неполадок, которые я почерпнул из часов поиска в форумах MySQL.

Сначала откройте два окна консоли. В одном, войдите в MySQL как пользователь приложения. В другом случае войдите в систему как root. В окне приложения перечислите базы данных.

SHOW DATABASES; 

Если база данных вашего приложения не отображается, вы должны перейти в корневое окно и предоставить привилегии базы данных.

USE mydatabase; 
GRANT ALL ON mydatabase TO appuser; 

Теперь вернитесь в окно приложения. Перечислите базы данных еще раз, чтобы убедиться, что они отображаются. Теперь, когда это произойдет, займитесь этим.

USE mydatabase; 

Как только вы входите, попробуйте просмотреть процедуру.

SHOW CREATE PROCEDURE myproc /G 

Одна из трех вещей случится. Если вы получите сообщение о том, что «ПРОЦЕДУРА myproc не существует», пользователь приложения не имеет для него прав. Вернитесь в корневое окно и выделите их.

GRANT EXECUTE ON PROCEDURE myproc TO appuser; 

Вторая вещь, которая может произойти, заключается в том, что процедура будет найдена, но тело не будет указано. Вместо этого он скажет «Create Procedure: NULL». Если да, вернитесь в корневое окно и позаботьтесь об этом.

GRANT SELECT ON mysql.proc TO appuser; 

Третья вещь, которая может произойти, - это то, что вы хотите; тело процедуры будет указано. Теперь вы можете вызвать эту процедуру из своего приложения.

Предупреждение

Вы можете захотеть взять пару коротких путей для решения таких проблем, как эти. Пожалуйста, не надо. Ярлыки могут вызвать большие проблемы в будущем.

Первое, что вы можете попробовать - использовать учетную запись root из своего приложения. Это очень опасно. Безопасность идет слоями. Хотя вы должны использовать хранимые процедуры и подготовленные инструкции, чтобы избежать атак SQL-инъекций, вы также должны применять принцип наименьших привилегий на случай, если они возникнут в любом случае. Разрешить подключению вашего приложения с правами root дает злоумышленнику доступ к вашему самому ценному ресурсу: ваши данные. Но предоставление каждой части приложения отдельной учетной записи только с привилегией, что она требует карантина плохого парня.

Вторая вещь, которую вы можете попробовать после нескольких часов исследования, - установить флаг noAccessToProcedureBodies в строке соединения ConnectorJ. Пожалуйста, избегайте этого флага, поскольку он обходит тип параметра, проверяемый драйвером JDBC. Этот флаг вызывает ConnectorJ для преобразования всех параметров в строки, которые MySQL затем преобразует обратно в требуемый тип.

Но, пройдя шаг за шагом, эти короткие сокращения не должны быть необходимы.

Ссылка

http://adventuresinsoftware.com/blog/?p=74

Смежные вопросы