1. 程式人生 > >11.子程式的高階特性2

11.子程式的高階特性2

來源:網易雲課堂《精通MySQL儲存過程、函式和觸發器》課程

講師: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日誌。但對資料複製可能是不安全的