Java DFC中的原始SQL(Documentum)
在DFC中,可以使用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
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);