6

DFC では、メソッドを使用して (DQL をバイパスして) SQL を直接実行できますIDfSession.apiExec()。問題は、メソッドがDFC API の現在の (6.x、7.x) バージョンで非推奨としてマークされていることです。

非推奨のメソッドを使用したコード例を次に示します。

IDfSession session;
(...)
String sql = "UPDATE dm_sysobject_s SET r_modifier = 'hacker' WHERE r_object_id = '<some_id>'";
session.apiExec("execsql", sql);

これは問題なく動作しますが、既に述べたようapiExecに非推奨です。

別のアプローチも試しました:

(...)
IDfQuery query = new DfQuery(sql);
query.execute(session, IDfQuery.DF_EXEC_QUERY);

私の知る限り、これは機能するはずですが、次のメッセージが表示され続けます。

[DM_QUERY_E_REG_TABLE_PERMIT_IN]error:  "You have insufficient privilege to UPDATE the dbo.dm_sysobject_s table."

を使用すると同じエラーメッセージが表示されますIDfQuery.DF_QUERYが、とにかく DF_EXEC_QUERY が機能するはずです-または? もちろん、スーパーユーザーアカウントでこれを試しているので、どの権限が欠けているのかわかりません。

DFC 内から未加工の SQL ステートメントを実行する、推奨されていない適切な方法はありますか?

また、生の SQL は Documentum のセキュリティ モデルをバイパスするため、使用しないことを強くお勧めしますJavaコードで使用できることも認識してい@SuppressWarnings("deprecation")ますが、それによってメソッドが非推奨になるわけではありません。

4

3 に答える 3

1

私はこれを自分で調べて逆コンパイルしDfSessionました。メソッド DFC では、apiExec()「部外者」が利用できるいくつかの内部呼び出しが使用されます。これにより、独自の「apiExec() 相当物」を作成できるようになります。

BOF クラス (たとえば、TBO 実装) 内の簡単な例を次に示します。

import static com.google.common.base.Strings.isNullOrEmpty;
...
import com.documentum.dmcl.impl.DmclApi;
...

public class MyBofClass extends MyBofInterface {
    ...

    private boolean execSql(String sql) throws DfException {
        return execApi("execsql", sql);
    }

    private boolean execApi(String command, String args) throws DfException {
        return execApi(getSession(), command, args);
    }

    private boolean execApi(IDfSession session, String command, String args) throws DfException {
        StringBuilder apiBuilder = new StringBuilder(command);
        apiBuilder.append(',');
        apiBuilder.append(session.getSessionId());
        if (!isNullOrEmpty(args)) {
            apiBuilder.append(',');
            apiBuilder.append(args);
        }
        return DmclApi.getInstance().exec(apiBuilder.toString());
    }
    ...
}

(おそらく、これを静的な util クラスまたは優先されるものに再構築する必要があります。)

ここで重要な部分はもちろんDmclApi.getInstance().exec()呼び出しです。apiExec()これは醜いハックですが、私の意見ではオリジナルより悪くはありません。本当に再実装です。

于 2014-03-10T12:16:29.637 に答える
1

Documentum Content Server と同様に、SQL Server への直接接続をサポートできます。そして、それらの接続でSQLステートメントを実行します。もう 1 つは、SQL を他のものに置き換える方法を見つけることです。SQL ビュー、ストアド プロシージャなどを作成します。

于 2014-03-07T15:29:31.900 に答える
-1

getCommand次のように、setQueryexecuteチェーンを試してください。

IDfApplyExecSQL execSQL = DfAdminCommand
        .getCommand(IDfAdminCommand.APPLY_EXEC_SQL);
execSQL.setQuery("UPDATE....");
execSQL.execute(session);

それでも権限メッセージが表示される場合は、SQL サーバーまたは SQL サーバーへの接続に問題がある可能性があります。

于 2014-03-18T18:25:24.807 に答える