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={OraClient11g_home1 の Oracle};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 スクリプト\JMP DSN\ DSN 認証情報を取得する.jsl」 );
);
接続 =データベース接続を作成する(::DSN 資格情報を取得);
SQL1 = 「SELECT * FROM DB.TABLE」 」 ;
OUTFILE1 = 「私のファイル名」 ;
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" ) ;
グローバルを表示() ;
これで、元のスクリプトで使用されていないデータベースも含め、すべてのデータベース情報が Get DSN_CREDENTIALS.jsl に保存されました。受け取った。この 2 番目の部分は、すべての「::」を「__」 (二重アンダースコア) に変更することで簡単に修正できます。これにより、::my_dsn_credentials が __my_dsn_credentials になります。これにより、グローバル変数が show globals(); に表示されなくなります。関数。 ただし、これでも、指定されたデータベースが侵害される問題は解決されません。 これは次の形式で修正することもできます。
DSN_CREDENTIALS.jsl を取得する:
// DSN_CREDENTIALS.jsl を取得します
__my_dsn_credentials = 「Driver={OraClient11g64_home1 の Oracle};Dbq=MY_DATABASE;UID=MYUSERID;PWD=MYPASSWORD;」 ;
__dbc =データベース接続を作成する(__ my_dsn_credentials ) ;
// 何も返しません
__my_dsn_credentials = 。 ;
これにより 2 つの問題が修正されます。__dbc を別のスクリプトに渡すことができます。__dbc を実行すると;上記のスクリプトのログに「Database( "Oracle in OraClient11g64_home1(MY_DATABASE)" )」が渡されます。ドライバーとデータベースを表示することは、ユーザー名とパスワードを渡すことよりもセキュリティ上の脅威がはるかに少ないです。2 番目に、これは重要ですが、__my_dsn_credentials が上書きされます。これは、たとえ変数を推測したとしても、情報は依然として安全であることを意味します。
Re: JMP スクリプトには DSN パラメータが埋め込まれています。なぜ??これは、JMP 10 の環境設定にはないようです。480 ページの JSL スクリプト ガイドにあります。JSL で設定する必要があります。関連する部分は次のとおりです。
注: ODBC データベースからデータをインポートすると、ユーザー ID を含めることができるテーブル変数が追加されます。
そしてパスワード情報。 これを防ぐには、次の JSL のみの設定を設定します。
県( ODBC 接続文字列の非表示( 1 )) ;
Re: JMP スクリプトには DSN パラメータが埋め込まれています。なぜ??このコメントを投稿するまで、ODBC の管理に関する情報は見つかりませんでした。私のバージョンの JMP 10 にはこのオプションがありません。

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 接続文字列の非表示] を選択することで簡単に抑制できます。これは、組織に固有の設定ファイルを介してユーザーに広められる可能性があります。