گیک فارسی

نوشته های یک گیک فارسی از فعالیت ها ،‌ علاقه مندی ها و نقد هایش

حل دو مشکلی که در زمان ساخت یک Procedure یا Function در MySQL معمولاً پیش میاد

نویسنده:
27 مارس 15

نمیدونم شما از Function ها ، Procedure ها یا حتی Trigger ها در MySQL استفاده میکنید یا نه و الان هم نمیخوام از بهینه سازی هایی که میشه از طریق اون ها به وجود آورد بگم. توی انجمن‌ها و در میان دوستان بارها دیدم که یکی از دلایلشون این هست که وقتی خروجی SQL میگیرن از روال یا تابعی که در MySQL ساختند و میخوان اون را توی PHPMyAdmin روی هاست اجرا کنند به خطاهایی بر میخورن که فکر میکنن دسترسی ایجاد روال یا تابع را ندارند یا کلاً با خطای غیر سر راستی مثل خطای ۱۰۶۴ مواجه میشن که برای هر نوع خطای Syntax یا مثلاً استفاده از Reserved Words میتونه باشه.

زمانی که از PHPMyAdmin یا MySQL Dump یا هر برنامه دیگه ای مثل Navicat خروجی میگیرین برای یک روال یا تابع ، توی جمله تعریفش از Definer استفاده کرده و این تعریف Definer دردسر سازه. به طور کلی کاربر برای اینکه بتونه Definer یک تابع یا روال یا … را کاربر دیگه ای قرار بده نیاز به Super Privilege داره.

حالا مشکل اینجاست که Definer ی که روی سیستم شما از MySQL خروجی گرفته میشه قائدتا (مگر اینکه نام کاربری روی سیستم شما و سرور یکی باشه ، مثلاً root که روی میزبانی های Shared احتمالش نزدیک به صفره) یکی نیستند و چون کاربری که شما برای MySQL از طریق CPanel میسازین دسترسی Super Privilege نداره خطای زیر صادر میشه :

SQL Error 1227: Access denied; you need the SUPER privilege for this operation

برای حل این مشکل کافیه Definer را از جمله Create حذف کنید یا نام کاربر سرور را با نامی که خروجی تولید کرده عوض کنید.

یکی دیگه از مشکلاتی که خیلی دیدم این هست که بعد از اجرا کردن Query مربوط به ساخت روال یا تابع خطای زیر را دریافت میکنند :

#۱۰۶۴ - 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 N

این خطا مربوط میشه به بحث Delimiter ، همونطور که میدونین توی SQL وقتی میخواین چند تا دستور را پشت سر هم بفرستین به MySQL آخر هر دستور Semicolon میگذارین. حالا مشکلی که در زمان تعریف روال و تابع در MySQL وجود داره این هست که Semicolon هایی که بعد از Create یا Begin قرار میگیرن باعث میشن که تعریف کل تابع یا روال شکسته بشه و MySQL فکر کنه جمله Create کامل نیست.

راه حل خیلی ساده هستش ، کافیه در زمان اجرای Query به MySQL بگیم که از یک Delimiter غیر از Semicolon استفاده کنه. به این شکل :

delimiter $$
create procedure myProc()
begin 
SELECT * FROM table;
end;
$$
delimiter ;

امیدوارم همیشه به جای اینکه بی خیال کار بشین کمی تحقیق کنین و سر در بیارین که چرا خطا میگیرین.