select `name` from mysql.proc where `type` = 'procedure';
select `name` from mysql.proc where `type` = 'function';
select definer from mysql.proc where definer like '%demo%';
select definer from mysql.events;
select definer from information_schema.views;
select definer from information_schema.triggers;
show create procedure proo_bm_createmessagedata;
mysql> drop procedure if exists `proo_bm_createmessagedata`;
......
mysql> grant all privileges on *.* to root@"%" identified by ".";
query ok, 0 rows affected (0.01 sec)
mysql> flush privileges;
query ok, 0 rows affected (0.02 sec)
mysql> delimiter //
mysql> create definer=`root`@`%` procedure `prou_bm_planstatuschange`()
begin-- 宣告變數
declare
row_id bigint ( 20 );
......
...end;
//query ok, 0 rows affected (0.00 sec)
mysql>
注意
關於delimiter
mysql預設結束是分號;但是,delimiter
可以自定義結束符號。例如:
delimiter $$ --先定義結束符匯出: drop trigger if exists triggername $$
create trigger triggername after delete on
id
for each row begin
… end; – 遇到;mysql直譯器不再執行
− −遇
到-- 遇到
−−遇到
開始執行
delimiter ; – 還原結束符
mysqldump -u 資料庫使用者名稱 -p -n -t -d -r --triggers=false 資料庫名 > 檔名
-d 表示–no-create-db,匯入:-n表示–no-data
-t表示–no-create-info,
-r表示匯出function和procedure
–triggers=false
-ntd 是表示匯出儲存過程
-r是表示匯出函式
mysqldump -uroot -p -ntd -r demo > sql.sql
mysqldump -h127.0.0.1 -uroot -p -ntd -r --triggers=false demo > demo.sql
匯入前,確認sql檔案中 definer !!! 匯入時所用賬號 並不具有 super 許可權,所以無法建立 其他賬號 的所屬物件。
如果需要修改definer為新的庫名
利用vi命令全域性替換
:1,$ s/olddbname/newdbname/g
mysql -h127.0.0.1 -uroot -p demo < demo.sql
先看下mysql是否設定了環境變數,如果沒設定,就需要切換到mysql的bin目錄下執行命令(我的已經設定過了)
mysql -hlocalhost -uroot -p123456
給root使用者新增許可權
grant
allprivilegeson*
.*to root@"%
" identified by "
.";
重新整理許可權
flush privileges
;
附加:
mysql 中乙個很特別的許可權控制機制,像檢視、函式、儲存過程、觸發器等這些資料物件會存在乙個definer
和乙個sql security
的屬性,如下所示:
--檢視定義
create algorithm = undefined definer = `root`@`%` sql security definer view v_test
--函式定義
create definer=`root`@`%` function `f_test()` returns varchar(100) sql security definer
--儲存過程定義
create definer=`root`@`%` procedure `p_test`() sql security definer
--觸發器定義
create definer=`root`@`%` trigger t_test
--事件定義
create definer=`root`@`%` event `e_test`
1234567891011121314
如果匯入賬號具有 super 許可權,即使物件的所有者賬號不存在,也可以匯入成功,但是在查詢物件時,如果物件的sql security
為definer
,則會報賬號不存在的報錯。
error 1449 (hy000): the user specified as a definer (『root』@』%』) does not exist
mysql儲存過程 MySQL儲存過程
在本節中,您將逐步學習如何在mysql中編寫和開發儲存過程。首先,我們向您介紹儲存過程的概念,並討論何時使用它。然後,展示如何使用過程 的基本元素,如建立儲存過程的語句,if else,case,loop,儲存過程的引數。下面每個教程都包含了易於理解的示例和詳細的說明。如果您瀏覽並學習所有教程,您可...
mysql 儲存過程 mysql 儲存過程
建立 為建立儲存過程的結束標誌,使用delimiter 可更改標誌 格式create procedure begin sqlend create procedure myprocedure in param integer begin select from tb role where tb rol...
mysql 儲存過程 MySQL儲存過程
目錄 儲存過程 簡介是一組為了完成特定功能的sql語句集合 比傳統sql速度更快 執行效率更高 儲存過程的優點 執行一次後,會將生成的二進位制 駐留緩衝區,提高執行效率 sql語句加上控制語句的集合,靈活性高 在伺服器端儲存,客戶端呼叫時,降低網路負載 可多次重複被呼叫,可隨時修改,不影響客戶端呼叫...