【问题标题】:SET a variable in mysql only once只在mysql中设置一个变量一次
【发布时间】:2018-01-04 10:59:57
【问题描述】:

我使用的是经典的 ASP 和 MySQL(使用 PHP 不会改变问题的重点)。

我需要在我的主页上设置一个变量:

SET block_encryption_mode = 'aes-256-cbc'

我不能将它设置为全局变量,因为其他用户正在使用服务器,可能会使用默认的block_encryption_mode

我知道我可以在每个网页的开头使用使用 ASP/PHP 的语句,但这似乎占用了太多资源;每个用户都会在每个页面上执行 SET 语句...

有没有办法在每个会话开始时设置变量或执行一些其他 SQL 语句,比如像 ASP 那样的 onstart 事件,也许?或者,如果不对我拥有的每个页面上的每个用户执行查询,我怎么能实现我的目标?

【问题讨论】:

    标签: mysql


    【解决方案1】:

    您可以使用init_connect 变量。

    服务器为连接的每个客户端执行的字符串。字符串由一个或多个 SQL 语句组成,以分号字符分隔。

    你也可以用这样的代码来区分用户:

    IF (CURRENT_USER() = 'special_crypto_dude@localhost') THEN
        SET SESSION block_encryption_mode = 'aes-256-cbc';
    END IF;
    

    【讨论】:

      【解决方案2】:

      在每个页面上调用SET 是安全的,因为它以微秒为单位执行。在已经打开的连接上调用SET 几乎没有开销。

      除非您可以全局应用此设置,否则我不会打扰。获取数据库连接句柄后直接设置block_encryption_mode(连同collationtimezone)即可。

      【讨论】:

      • 但是这个字符串在每个客户端上执行,也来自不希望这个 SET 存在的其他网站......
      • 据我所知 block_encryption_mode 是一个会话变量,所以使用 SET 应该不会影响其他客户端。另外,我认为您需要管理员权限才能将值设置得比您自己的会话更远。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多