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中执行此操作?
答案 0 :(得分:2)
DBD :: mysql使用MySQL C API,它似乎不支持登录路径。作为替代方案,您可以在mysql_read_default_group
来电中使用option file以及mysql_read_default_file
和connect
选项:
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
使用的文件)不同,常规选项文件未加密。这并不像听起来那么大。加密的主要好处是它可以防止您意外地暴露您的凭据,例如:查看文件时,但它不提供牢不可破的安全性。您仍然可以保护您的选项文件,确保它不是世界可读的,不包括版本控制等。