log_bin_trust_function_creators变量解释

这是我们开启了bin-log, 我们就必须指定我们的函数是否是
1 DETERMINISTIC 不确定的
2 NO SQL 没有SQl语句,当然也不会修改数据
3 READS SQL DATA 只是读取数据,当然也不会修改数据
4 MODIFIES SQL DATA 要修改数据
5 CONTAINS SQL 包含了SQL语句

其中在function里面,只有 DETERMINISTIC, NO SQL 和 READS SQL DATA 被支持。如果我们开启了 bin-log, 我们就必须为我们的function指定一个参数。


在MySQL中创建函数时出现这种错误的解决方法:

set global log_bin_trust_function_creators=TRUE;




[Err] 1227 - Access denied; you need (at least one of) the SUPER privilege(s) for this operation

这个问题是由于导入的sql脚本中存在DEFINER=`root`@`%` 、DEFINER=`sspdbexecuter`@`localhost`,由于没有相应的权限,所以导入报错

解决方法:
1)去掉sql脚本中的DEFINER=`root`@`%` 、DEFINER=`sspdbexecuter`@`localhost` (如果不去掉,即使给了grant all ...sspdbexecuter@'localhost'也一样报错)
2)去掉上面的内容后,便引发第2个问题“ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL,or READS SQL DATA in its declaration”


 解决方法有两种,一种是在create语句中指定deterministic参数,一种是在mysql中设置 log_bin_trust_function_creators = 1;,目前暂时设置的SET GLOBAL log_bin_trust_function_creators = 1;(该设置在重启时会自动消失,除非写入配置文件)


主从复制中不会直接复制参数设置,因此三台均要做此设置,但是这个设置也是有安全风险的。


在MySQL主从复制机器的master的数据库中创建function,报出如下错误:
  Error Code: 1418. This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)
  原来是因为在主从复制的两台MySQL服务器中开启了二进制日志选项log-bin,slave会从master复制数据,而一些操作,比如function所得的结果在master和slave上可能不同,所以存在潜在的安全隐患。因此,在默认情况下回阻止function的创建。
  有两种办法来解决这一问题
1.将log_bin_trust_function_creators参数设置为ON,这样一来开启了log-bin的MySQL Server便可以随意创建function。这里存在潜在的数据安全问题,除非明确的知道创建的function在master和slave上的行为完全一致。
  设置该参数可以用动态的方式或者指定该参数来启动数据库服务器或者修改配置文件后重启服务器。需注意的是,动态设置的方式会在服务器重启后失效。
mysql> show variables like 'log_bin_trust_function_creators';
mysql> set global log_bin_trust_function_creators=1;
  另外如果是在master上创建函数,想通过主从复制的方式将函数复制到slave上则也需在开启了log-bin的slave中设置上述变量的值为ON(变量的设置不会从master复制到slave上,这点需要注意),否则主从复制会报错。

2.明确指明函数的类型
1 DETERMINISTIC 不确定的
2 NO SQL 没有SQl语句,当然也不会修改数据
3 READS SQL DATA 只是读取数据,当然也不会修改数据
  比如:CREATE DEFINER=`username`@`%` READS SQL DATA FUNCTION `fn_getitemclock`(i_itemid bigint,i_clock int,i_pos int) RETURNS int(11)...
这样一来相当于明确的告知MySQL服务器这个函数不会修改数据,因此可以在开启了log-bin的服务器上安全的创建并被复制到开启了log-bin的slave上。

阅读更多
换一批

变量解释

04-12

麻烦各位看下 bool P_bool_reVal1 这个是什么意思啊 看不懂这里了rnrnrnusing System;rnusing System.Data;rnusing System.Configuration;rnusing System.Collections;rnusing System.Web;rnusing System.Web.Security;rnusing System.Web.UI;rnusing System.Web.UI.WebControls;rnusing System.Web.UI.WebControls.WebParts;rnusing System.Web.UI.HtmlControls;rnrnpublic partial class ShoppingCart : System.Web.UI.Pagernrn public static string M_str_Count;rn protected void Page_Load(object sender, EventArgs e)rn rn if (!IsPostBack)rn if (Session["UserID"] != null)rnrn rn rn //向购物车中添加商品,如果购物车中已经存在该商品,则商品数量加1,如果是第一次购买,则向购物车中添加一条商品信息rn rn string P_str_CartID = Session["UserID"].ToString();rn rnrn string P_str_GoodsID = Request["GoodsID"];rn DataSet ds = DB.reDs("select count(*) from tb_Cart where CartID=" + P_str_CartID + "and GoodsID=" + P_str_GoodsID);rn if (ds.Tables[0].Rows[0][0].ToString() == "0")rn rnrn DataSet ds1 = DB.reDs("select GoodsName,GoodsPrice from tb_GoodsInfo where GoodsID=" + P_str_GoodsID);rn string P_str_GoodsName = ds1.Tables[0].Rows[0][0].ToString();rn string P_str_GoodsPrice = ds1.Tables[0].Rows[0][1].ToString();rn string P_str_Num = "1";rn DB.ExSql("insert into tb_Cart values(" + P_str_CartID + "," + P_str_GoodsID + ",'" + P_str_GoodsName + "'," + P_str_GoodsPrice + "," + P_str_Num + ")");rn rn elsern rn DB.ExSql("update tb_Cart set Num=Num+1 where CartID=" + P_str_CartID + "and GoodsID=" + P_str_GoodsID);rn rnrnrn //显示购物车中的商品信息rn Bind();rn rn rn //绑定DataList控件rn public void Bind()rn rn DataSet ds2 = DB.reDs("select *,GoodsPrice*Num As Count from tb_Cart where CartID=" + Session["UserID"]);rn float P_fl_Count = 0;rn foreach (DataRow dr in ds2.Tables[0].Rows)rn rn P_fl_Count += Convert.ToSingle(dr[6]);rn rn M_str_Count = P_fl_Count.ToString();rn dlShoppingCart.DataSource = ds2;rn dlShoppingCart.DataBind();rn rnrn protected void dlShoppingCart_ItemDataBound(object sender, DataListItemEventArgs e)rn rn //用来实现数量文本框中只能输入数字rn TextBox txtGoodsNum = (TextBox)e.Item.FindControl("txtGoodsNum");rn if (txtGoodsNum != null)rn rn txtGoodsNum.Attributes["onkeyup"] = "value=value.replace(/[^\\d]/g,'')";rn rnrn rn //清空购物车rn protected void lnkbtnClear_Click(object sender, EventArgs e)rn rn bool P_bool_reVal = DB.ExSql("Delete from tb_Cart where CartID=" + Session["UserID"]);rn if (!P_bool_reVal)rn Response.Write(" ");rn elsern Bind();rn rn //清空购物车时的提示信息rn protected void lnkbtnClear_Load(object sender, EventArgs e)rn rn lnkbtnClear.Attributes["onclick"] = "javascript:return confirm('你确定要清空购物车吗?')";rn rn //继续购物rn protected void lnkbtnContinue_Click(object sender, EventArgs e)rn rn Response.Redirect("~/Default.aspx");rn rn //删除购物车中的商品rn protected void dlShoppingCart_DeleteCommand(object source, DataListCommandEventArgs e)rn rn bool P_bool_reVal = DB.ExSql("Delete from tb_Cart where CartID=" + Session["UserID"] + " and GoodsID=" + e.CommandArgument.ToString());rn if (!P_bool_reVal)rn Response.Write(" ");rn elsern Bind();rn rn //删除购物车中的商品时的提示信息rn protected void lnkbtnDel_Load(object sender, EventArgs e)rn rn ((LinkButton)sender).Attributes["onclick"] = "javascript:return confirm('你确定要删除该物品吗?')";rn rn //更新购物车rn protected void dlShoppingCart_ItemCommand(object source, DataListCommandEventArgs e)rn rn if (e.CommandName == "updateNum")rn rn string P_str_Num = ((TextBox)e.Item.FindControl("txtGoodsNum")).Text;rn bool P_bool_reVal = DB.ExSql("update tb_Cart set Num=" + P_str_Num + "where CartID=" + Session["UserID"] + "and GoodsID=" + e.CommandArgument.ToString());rn if (P_bool_reVal)rn Bind();rn rn rn protected void lnkbtnSettleAccounts_Click(object sender, EventArgs e)rn rn if (M_str_Count == "")rn rn Response.Write(" ");rn rn elsern if (Session["UserID"] != null)rn rn DataSet ds = DB.reDs("select Money from tb_User where UserID=" + Session["UserID"].ToString());rn decimal P_str_Money = Convert.ToDecimal(ds.Tables[0].Rows[0][0].ToString());rn if (P_str_Money < Convert.ToDecimal(M_str_Count))rn rn Response.Write(" ");rn rn elsern rn bool P_bool_reVal1 = DB.ExSql("Delete from tb_Cart where CartID=" + Session["UserID"]);rn bool P_bool_reval2 = DB.ExSql("update tb_User set Money=Money-" + M_str_Count + " where UserID=" + Session["UserID"]);rn if (!P_bool_reVal1 & !P_bool_reval2)rn rn Response.Write(" ");rn rn elsern rn Bind();rn //Response.Redirect("SuccessShop.aspx");rn Response.Write(" ");rn rn rn rn rn protected void dlShoppingCart_SelectedIndexChanged(object sender, EventArgs e)rn rnrn rnrn

没有更多推荐了,返回首页