在perl DBD :: mysql中使用--login-path = local

时间:2016-07-25 14:12:05

标签: mysql perl dbi dbd-mysql

mysql支持使用名为.mylogin.cnf的文件中存储的本地身份验证凭据进行无密码登录(有关详细信息,请参阅here)。

例如:

WITH inputs 
     AS (SELECT 1 as id, '6.0.5.94' as col FROM DUAL
         UNION ALL
         SELECT 2,'5.3.30.8' FROM DUAL
         UNION ALL
         SELECT 3,'5.3.4.8' FROM DUAL
         UNION ALL
         SELECT 4,'3' FROM DUAL
         UNION ALL
         SELECT 5,'3.3.40' FROM DUAL
         UNION ALL
         SELECT 6,'3.3.4.1.5' FROM DUAL
         UNION ALL
         SELECT 7,'3.3.4.1' FROM DUAL)
    SELECT col, MAX (SYS_CONNECT_BY_PATH (v, '.')) p
      FROM (SELECT t.col, TO_NUMBER (SUBSTR (x.COLUMN_VALUE, 1, 5)) r, SUBSTR (x.COLUMN_VALUE, 6) v, id rid
              FROM inputs t,
                   TABLE (
                      CAST (
                         MULTISET (
                                SELECT    TO_CHAR (LEVEL, 'fm00000')
                                       || TO_CHAR (TO_NUMBER (SUBSTR ('.' || col || '.', INSTR ('.' || col || '.', '.', 1, ROWNUM) + 1, INSTR ('.' || col || '.', '.', 1, ROWNUM + 1) - INSTR ('.' || col || '.', '.', 1, ROWNUM) - 1)), 'fm0000000000')
                                  FROM DUAL
                            CONNECT BY LEVEL <= LENGTH (col) - LENGTH (REPLACE (col, '.', '')) + 1) AS SYS.odciVarchar2List)) x)
START WITH r = 1
CONNECT BY PRIOR rid = rid AND PRIOR r + 1 = r
  GROUP BY col
  ORDER BY p

我的问题是:如何使用DBD :: mysql在perl中执行此操作?

1 个答案:

答案 0 :(得分:2)

DBD :: mysql使用MySQL C API,它似乎不支持登录路径。作为替代方案,您可以在mysql_read_default_group来电中使用option file以及mysql_read_default_fileconnect选项:

use strict;
use warnings 'all';

use DBI;

my $dsn = 'DBI:mysql:' .
          ';mysql_read_default_group=local' .
          ';mysql_read_default_file=/path/to/config';

my $dbh = DBI->connect($dsn, undef, undef, {
    PrintError => 0,
    RaiseError => 1
});

您的选项文件应如下所示:

[local]
host     = localhost
database = foo
user     = myuser
password = mypassword

[remote]
host     = remote.example.com
database = foo
user     = myuser
password = mypassword

请注意,与.mylogin.cnf(--login-path使用的文件)不同,常规选项文件未加密。这并不像听起来那么大。加密的主要好处是它可以防止您意外地暴露您的凭据,例如:查看文件时,但它不提供牢不可破的安全性。您仍然可以保护您的选项文件,确保它不是世界可读的,不包括版本控制等。