6

IDfSession.apiExec()在 DFC 中,可以使用该方法直接执行 SQL(绕过 DQL) 。问题是该方法在 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 的安全模型。我也知道我可以@SuppressWarnings("deprecation")在我的 Java 代码中使用,但这并没有减少该方法的弃用。

4

3 回答 3

1

与 Documentum Content Server 一样,您可以支持直接连接到您的 sql 服务器。并在这些连接中执行您的 sql 语句。另一件事是找到一种方法用其他东西代替你的 SQL 东西。创建sql视图、存储过程等。

于 2014-03-07T15:29:31.900 回答
1

我自己研究了一下并反编译DfSession。在apiExec()方法中,DFC 使用了一些可供“外部人员”使用的内部调用,这使得创建自己的“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());
    }
    ...
}

(可能应该将其重组为静态实用程序类或任何首选。)

这里的关键部分当然是DmclApi.getInstance().exec()调用。apiExec()这是一个丑陋的黑客,但在我看来并不比原来的差。这是一个重新实现,真的。

于 2014-03-10T12:16:29.637 回答
-1

尝试getCommand,setQueryexecute链,如下所示:

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

如果您仍然收到权限消息,则可能是您的 SQL 服务器或与它的连接有问题。

于 2014-03-18T18:25:24.807 回答