Переглянути збережену процедуру / визначення функції у MySQL


79

Що таке команда MySQL для перегляду визначення збереженої процедури або функції, подібної до sp_helptextMicrosoft SQL Server?

Я знаю, що SHOW PROCEDURE STATUSвідобразиться список доступних процедур. Мені потрібно побачити визначення єдиної процедури.


2
ВИБЕРІТЬ * FOM mysql.proc \ G;
zloctb

Відповіді:


123
SHOW CREATE PROCEDURE <name>

Повертає текст визначеної раніше збереженої процедури, яка була створена за допомогою CREATE PROCEDUREоператора. Замінити PROCEDUREна FUNCTIONзбережену функцію.


я отримую#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
Govind Singh

+1 Це мені вже тричі допомагало. Днями я запам’ятаю наказ напам'ять.
Зареєстрований користувач

3
Це не буде працювати, якщо Mysql не був скомпільований --with-debug. Отже, це не працює на екземплярах AWS RDS. Спробуйте показати процедуру створення 'xxxx'; як @valli внизу
ChrisR

39

Ви можете використовувати це:

SELECT ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_SCHEMA = 'yourdb' AND ROUTINE_TYPE = 'PROCEDURE' AND ROUTINE_NAME = "procedurename";

9
На жаль, ROUTINE_DEFINITION не включає параметри IN / OUT збереженої процедури, а також повернені значення (тоді як SHOW CREATE PROCEDURE це робить). Якщо ви хочете отримати їх, ви можете зробити запит прямо до mysql.proc, наприклад, SELECT param_list, return, body FROM mysql.proc WHERE db = 'yourdb' AND type = 'PROCEDURE' and name = 'procedurename';
GregW

@GregW цього запиту від mysql.procповернень згустків для param_list, returnsі body... я НЕ зміг прочитати їх ... Як ти це зробив?
Дмитро Єфименко

nvm, знайшов відповідь тут
Дмитро Єфименко

2
Майте на увазі, що ROUTINE_DEFINITION буде нульовим, якщо користувач, який виконує запит, не є ВИЗНАЧАЧОМ, а для захисту встановлено значення ВИЗНАЧИТЕЛЬ. Ви не матимете проблем, якщо для безпеки встановлено значення INVOKER. Ви також можете отримати параметри від SELECT * FROM information_schema.PARAMETERS WHERE SPECIFIC_SCHEMA='$dbName' AND SPECIFIC_NAME=\"{$row['ROUTINE_NAME']}\" AND NOT PARAMETER_MODE IS NULL ORDER BY ORDINAL_POSITION;
Peter Brand

Виправлення, навіть якщо для безпеки встановлено значення INVOKER, визначення буде нульовим, якщо користувач, що виконує запит, не збігається з визначенням.
Пітер Бренд

10
SHOW CREATE PROCEDURE proc_name;

повертає визначення proc_name


Це також не відображає тексту процедури.
posfan12

Працює для мене. Я використовую AWS / RDS без серверів. У тексті звіту відображається стовпець "Створити процедуру".
KingAndrew

10

Якщо ви хочете знати список процедур, ви можете запустити таку команду -

show procedure status;

Він надасть вам список процедур та їх визначення. Потім ви можете запустити show create procedure <procedurename>;


7

Ви можете використовувати таблицю proc в базі даних mysql :

mysql> SELECT body FROM mysql.proc
WHERE db = 'yourdb' AND name = 'procedurename' ;

Зверніть увагу, що ви повинні мати дозвіл на вибір mysql.proc :

mysql> GRANT SELECT ON mysql.proc TO 'youruser'@'yourhost' IDENTIFIED BY 'yourpass' ;

5

щось на зразок:

DELIMITER //

CREATE PROCEDURE alluser()
BEGIN
   SELECT *
   FROM users;
END //

DELIMITER ;

ніж:

SHOW CREATE PROCEDURE alluser

дає результат:

'alluser', 'STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER', 'CREATE DEFINER=`root`@`localhost` PROCEDURE `alluser`()
BEGIN
   SELECT *
   FROM users;
END'

3

Альтернативне швидке та хакерське рішення, якщо ви хочете отримати огляд усіх наявних продуктів або натрапити на проблему лише отримання заголовка процедури, показаного ШОУ СТВОРИТИ ПРОЦЕДУРУ:

mysqldump --user=<user> -p --no-data --routines <database>

Він також експортує описи таблиць, але без даних. Добре працює для нюхання навколо невідомих або забутих схем ...;)


-2

Ідеально, спробуйте:

SELECT ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.ROUTINES
    WHERE ROUTINE_SCHEMA = 'yourdb' AND ROUTINE_TYPE = 'PROCEDURE' AND ROUTINE_NAME = "procedurename";

2
Ласкаво просимо до SE! Поясніть, будь ласка, свою відповідь, особливо стосовно того, що відрізняє її від інших існуючих.
anderas
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.