JMPスクリプトはDSNパラメーターを埋め込みます。どうして??<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />JMPスクリプトは、JSLファイル内にデータ接続パラメーターを埋め込みます。そのような不適切なプログラミング慣行の理由はありますか?何百ものJSLがあり、SQL管理者がサーバーまたはデータベースの資格情報を変更することを決定したとします。DSNを仲介として使用してみませんか?
Re:JMPスクリプトはDSNパラメーターを埋め込みます。どうして??私はこの解決策を試し、結果の90%を取得しました...
データベースへの接続に成功しましたが、include関数でインポートされたDSN情報にUIDとPWDの値が含まれていても、接続により、ODBCポップアップウィンドウにDSN名とパスワードを入力するように求められます。
なぜこれが起こるのかについてのアイデアはありますか?
//DSNクレデンシャルを取得します
::DSNクレデンシャルを取得= "DRIVER = {Oracle in OraClient11g_home1}; DSN = myDB; UID = myUID; PWD = myPWD; DBQ = MyDB; DBA = W; APA = T; EXC = F; FEN = T; QTO = T; FRC = 10; FDL = 10; LOB = T; RST = T; GDE = F; FRL = F; BAM = IfAllSuccessful; MTS = F; MDI = F; CSR = F; FWC = F; PFC = 10; TLO = 0; " ;
//何も返さない
;
私のJmpスクリプトは正常に接続します:
もしも((空です(:: DSNクレデンシャルを取得)、
含む(( "C:\ _ JMP Scripts \ JMP DSN \ DSNクレデンシャルを取得する.jsl " );
);
接続=データベース接続を作成する(:: DSNクレデンシャルを取得する);
SQL1 = "SELECT * FROM DB.TABLE 「」 ;
OUTFILE1 = 「MyFilename」 ;
dt1 =データベースを開く(CONNECT、SQL1、OUTFILE1);
しかし、それでも私のDB名とパスワードを尋ねられます...
Re:JMPスクリプトはDSNパラメーターを埋め込みます。どうして??それは私がやってきたことよりも良いです。共有していただきありがとうございます。私には、技術者以外のユーザーと仕事をするという「贅沢」があります。
Re:JMPスクリプトはDSNパラメーターを埋め込みます。どうして??これは不十分なセキュリティソリューションです。データベースのユーザー名とパスワードを取得するために必要なのは、次のコマンドを実行することだけです。
含む(( "$ ADDIN_HOME(com.mydept.myapp)\ Get DSN_CREDENTIALS.jsl" )。 ;
::: my_dsn_credentials;
:: my_dsn_credentialsに保存されている内容は、プレーンテキストでログファイルに表示されます。クレデンシャルをすべて1つの場所にグローバル変数として格納することは言うまでもなく、これを簡単に実行できます。
含む(( "$ ADDIN_HOME(com.mydept.myapp)\ Get DSN_CREDENTIALS.jsl" )。 ;
globals()を表示;
これで、元のスクリプトで使用されていないデータベースも含め、すべてのデータベース情報がGetDSN_CREDENTIALS.jslに保存されました。受け取った。この2番目の部分は、すべての「::」を「__」(二重下線)に変更することで簡単に修正できます。したがって、::my_dsn_credentialsは__my_dsn_credentialsになります。これにより、グローバル変数がshow globals()に表示されなくなります。関数。 ただし、これでも、指定されたデータベースが危険にさらされる問題は解決されません。 これは、次の形式に従って修正することもできます。
DSN_CREDENTIALS.jslを取得します:
//DSN_CREDENTIALS.jslを取得します
__my_dsn_credentials = "Driver = {Oracle in OraClient11g64_home1}; Dbq = MY_DATABASE; UID = MYUSERID; PWD = MYPASSWORD;" ;
__dbc =データベース接続を作成する(__ my_dsn_credentials )。 ;
//何も返さない
__my_dsn_credentials = 。 ;
これにより、2つの問題が修正されます。1つは、__dbcを別のスクリプトに渡すことができます。__dbcを実行した場合; 'Database( "Oracle in OraClient11g64_home1(MY_DATABASE)")'を上記のスクリプトのログに渡します。ドライバーとデータベースの表示は、ユーザー名とパスワードを渡すので、セキュリティ上の脅威ははるかに少なくなります。次に、これは重要です。__my_dsn_credentialsが上書きされます。これは、変数を推測したとしても、情報は安全であることを意味します。
Re:JMPスクリプトはDSNパラメーターを埋め込みます。どうして??JMP10の設定には含まれていないようです。480ページの「JSLスクリプトガイド」にあります。JSLで設定する必要があります。関連する部分は次のとおりです。
注:ODBCデータベースからデータをインポートすると、ユーザーIDを含むことができるテーブル変数が追加されます。
およびパスワード情報。 これを防ぐには、次のJSLのみの設定を設定します。
設定(( ODBC非表示接続文字列(( 1 )) ;
Re:JMPスクリプトはDSNパラメーターを埋め込みます。どうして??このコメントを投稿する前に、ODBCの管理に関する情報が見つかりませんでした。私のバージョンのJMP10にはこのオプションがありません。

Re:JMPスクリプトはDSNパラメーターを埋め込みます。どうして??スマートソリューション;共有してくれてありがとう!
Re:JMPスクリプトはDSNパラメーターを埋め込みます。どうして??ODBCを介してOracleデータベースを呼び出すJSLスクリプトが何百もあります。ただし、各JSLファイル内に個別のデータ接続パラメーターを埋め込むことはありません。代わりに、INCLUDEステートメントを使用して、DSN文字列を定義する単一のJSLファイルを実行します。
私のコードは次のようになります。
JSLスクリプトが1つあります。 DSN_CREDENTIALS.jslを取得します:
// Get DSN_CREDENTIALS.jsl
::my_dsn_credentials = "Driver={Oracle in OraClient11g64_home1};Dbq=MY_DATABASE;UID=MYUSERID;PWD=MYPASSWORD;";
// Return nothing
.;
JSLのコード暗号化機能を使用してスクリプトを暗号化します。
次に、接続文字列が必要になるたびに、次のようなコードを使用します。
// Get database access string
if (is empty(::my_dsn_credentials),
include("$ADDIN_HOME(com.mydept.myapp)\Get DSN_CREDENTIALS.jsl");
);
dbc = create database connection(::my_dsn_credentials);
sql_statement = "SELECT SYSDATE FROM DUAL";
dt = execute sql(dbc, sql_statement);
close database connection(dbc);
Re:JMPスクリプトはDSNパラメーターを埋め込みます。どうして??お客様の大多数はこれが便利な機能であると感じており、実際、お客様の要望により追加されました。[設定]->[テーブル]->[ODBC非表示接続文字列]を選択すると、簡単に抑制できます。これは、組織に固有の設定ファイルを介してユーザーに配布できます。