11 子程式的高階特性2

2021-08-09 03:04:42 字數 1730 閱讀 9578

講師:huangxifeng607(黃錫峰)

筆記:(1)函式的唯讀高階特性

delimiter $$

create function testa() returns int

reads sql data

begin

declare my_uid int;

select uid into my_uid from hxf where salary<3000 limit 1;

return my_uid;

end;

$$delimiter;

1.提供子程式使用資料的內在資訊

reads sql data只包含讀的sql語句,說明只有讀,沒有更新,對複製精確性是安全的,則可以放行

(2)函式包含可更新語句的高階特性

delimiter $$

create function testa()

contains sql -> reads sql data

begin

update user set level=5 where uid=5;

return 5;

end;

$$delimiter;

如果函式包含了更新語句,指定為contains sql, modifies sql data等寫的高階特性是不允許建立的。

包含更新語句的函式可以指定為no sql, 或者reads sql data唯讀特性,才可以放行建立,複製可以正常進行

(3)函式包含可更新語句對複製的影響

delimiter $$

create function testa() returns int

modifies sql data

begin

update user set level=50 where uid=5;

return 5;

end;

$$delimiter;

如果函式包含了更新語句,指定為contains sql, modifies sql data, 並且允許建立,有兩個方案:

修改log_bin_trust_function_creators=1(從庫也要修改),

或者關閉binlog日誌

對複製的影響:這種更新記錄二進位制日誌,也能正常複製

(4)函式的高階特性特點

1.提供了函式使用資料的內在資訊:

contains sql 包含讀寫語句

no sql 無sql語句(唯讀)

reads sql data 唯讀的sql語句

modifies sql data 只寫的sql語句

2.函式涉及原則上不允許更新,歷史上函式更新對複製可能是不安全的。

二進位制不回記錄select語句,但只有函式中有更新語句時是例外的

3.如果包含了更新語句,指定為contains sql, modifies sql data是不允許建立的。

但可以指定為no sql, 或者reads sql data唯讀特性,才可以放行建立,複製可以正常進行

4.如果函式包含了更新語句,指定為contains sql, modifies sql data寫的高階特性,並且允許建立,有兩個方案:

修改log_bin_trust_function_creators=1(從庫也要修改),

或者關閉binlog日誌。但對資料複製可能是不安全的

10 子程式的高階特性1

講師 huangxifeng607 黃錫峰 筆記 1 deterministic特性 delimiter create procedure testa not deterministic begin declare my uid int default 0 select uid into my ui...

12 子程式的高階特性3

講師 huangxifeng607 黃錫峰 筆記 1 sql security特性 delimiter create procedure testa sql security definer invoker begin declare aa int select sleep 30 into aa e...

mysql子程式的高階特性(一)

delimiter create procedure test prod not deterministic begin update test score set score 6 where id 5 limit 1 end delimiter not deterministic 表示子程式包含了...