【Bug】Sql JDBC ET 变量覆盖有误
ZhengshuaiPENG opened this issue · 0 comments
ZhengshuaiPENG commented
背景说明
声明一个 sqlserver 的 JDBC 连接
set USER_NAME=`select aes_decrypt("2hSPXJVHGW19mMVf+WocKw==")` where type="sql" and scope="session";
set PASSPWORD=`select aes_decrypt("zxOfGfgBYAIFlchS9GcRJg==")` where type="sql" and scope="session";
set DB_NAME = "DEMO_DB" where scope = "session";
set JDBC_URL="jdbc:sqlserver://xxxxx:1433;databaseName=${DB_NAME};encrypt=true;trustServerCertificate=true" ";
CONNECT jdbc where
url="${JDBC_URL}"
and driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver"
and user= "${USER_NAME}"
and password = "${PASSWORD}"
as mssql_db_poc;
然后我们通过 SQL JDBC ET 来完成一个 ddl,比如 truncate table
run command as JDBC.`mssql_db_poc._` where
url="${JDBC_URL}"
and driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver"
and user= "${USER_NAME}"
and password = "${PASSWORD}"
and `driver-statement-0`="truncate table titanic_statistics;";
正确的行为设计
- 这里在使用
rum command as JDBC
语句时,引用了上述语句中声明的CONNECT
变量mssql_db_poc
, 理论上此时应该是不需要在 where 语句中声明url/driver/username/password
等一系列变量的,是可以直接使用mssql_db_poc
所定义的变量的。 - 如果在 使用
rum command as JDBC
语句在where中定义了url/driver/username/password
这一系列变量,则应该可以覆盖上述mssql_db_poc
引用的变量。当前的行为是,mssql_db_poc
覆盖了where 语句中的声明。不符合设计
另外如果在 Connect
语句中,不在where 语句中填写 user/password
,而将 user 和 password 声明进 jdbc url 时,这种情况是可以建立和 jdbc 的连接的,并可以在 load jdbc 语句进行加载 db 中的表的。 但接下来使用 run command as JDBC
时,如果在 where 语句中的 user 和 password 中引用变量时就会报错,必须要明文,示例如下
set USER_NAME=`select aes_decrypt("2hSPXJVHGW19mMVf+WocKw==")` where type="sql" and scope="session";
set PASSPWORD=`select aes_decrypt("zxOfGfgBYAIFlchS9GcRJg==")` where type="sql" and scope="session";
set DB_NAME = "DEMO_DB" where scope = "session";
set JDBC_URL="jdbc:sqlserver://xxxxx:1433;databaseName=${DB_NAME};user=${USER_NAME};password=${PASSWORD};encrypt=true;trustServerCertificate=true" ";
CONNECT jdbc where
url="${JDBC_URL}"
and driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver"
as mssql_db_poc;
然后我们通过 SQL JDBC ET 来完成一个 ddl,比如 truncate table
run command as JDBC.`mssql_db_poc._` where
url="${JDBC_URL}"
and driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver"
and user= "${USER_NAME}"
and password = "${PASSWORD}"
and `driver-statement-0`="truncate table titanic_statistics;";
这样写的话,就会报错,必须要在where 语句中显式的写 user 和 password 的值