Java DFC中的原始SQL(Documentum)

Java DFC中的原始SQL(Documentum),java,documentum,dfc,Java,Documentum,Dfc,在DFC中,可以使用IDfSession.apiExec()方法直接执行SQL(绕过DQL)。问题在于,在DFCAPI的当前(6.x,7.x)版本中,该方法被标记为已弃用 下面是使用不推荐使用的方法的一些示例代码: IDfSession session; (...) String sql = "UPDATE dm_sysobject_s SET r_modifier = 'hacker' WHERE r_object_id = '<some_id>'"; session.apiExe

在DFC中,可以使用
IDfSession.apiExec()
方法直接执行SQL(绕过DQL)。问题在于,在DFCAPI的当前(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);
据我所知,这应该行得通,但我一直得到以下信息:

[DM_QUERY_E_REG_TABLE_PERMIT_IN]error:  "You have insufficient privilege to UPDATE the dbo.dm_sysobject_s table."
使用
IDfQuery.DF\u QUERY
时,我会收到相同的错误消息,但无论如何,DF\u EXEC\u QUERY应该是有效的——或者?我当然是在用一个超级用户帐户来尝试,所以我不知道我缺少哪些特权

有没有一种好的、不推荐使用的方法从DFC中执行原始SQL语句


我还想补充一点,我非常清楚,由于原始SQL绕过了Documentum的安全模型,因此强烈反对使用它。我还知道,我可以在Java代码中使用
@SuppressWarnings(“弃用”)
,但这并不能减少该方法的弃用程度。

您可以像使用Documentum Content server一样支持直接连接到sql server。并在这些连接中执行sql语句。
另一件事是找到一种用smth else替代SQL的方法。创建sql视图、存储过程等等。

我自己研究了这个问题,并对DfSession进行了反编译。在
apiExec()
方法中,DFC使用一些可供“局外人”使用的内部调用,这使得创建自己的“apiExec()等价物”成为可能

下面是BOF类中的一个简单示例(例如,TBO实现):

(您可能应该将其重新构造为静态util类或其他首选类。)


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

尝试
getCommand
setQuery
execute
链,如下所示:

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

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

但是,如果DFC客户端无法直接访问DB服务,该怎么办?通常情况就是这样(只有特权客户端(如Content Server)可以连接到DB,或者DB位于另一个网段上,等等)。这也是一种“更加令人沮丧”的方式,因为没有人,但CS应该真正访问DB。但谢谢你的回复,这肯定是一种创造性的方法,我没有想到在某些情况下可能会奏效。
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());
    }
    ...
}
IDfApplyExecSQL execSQL = DfAdminCommand
        .getCommand(IDfAdminCommand.APPLY_EXEC_SQL);
execSQL.setQuery("UPDATE....");
execSQL.execute(session);