在DFC中,可以使用IDfSession.apiExec()方法直接执行SQL (绕过DQL)。问题是该方法在当前(6.x,7.x)版本的DFC API中被标记为不推荐使用。
下面是一些使用不推荐方法的示例代码:
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")代码中使用,但这并不会使这个方法不那么受欢迎。
发布于 2014-03-10 12:16:29
我亲自调查了这个问题,并对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());
}
...
}(可能应该将其重构为静态util类或其他首选类。)
这里的关键部分当然是DmclApi.getInstance().exec()调用。这是一次丑陋的黑客攻击,但在我看来并不比最初的apiExec()更糟糕。这是一个重新实现,真的。
发布于 2014-03-07 15:29:31
可以支持与sql服务器的直接连接,如。并在这些连接中执行sql语句。另一件事是找到一种方法,用smth来替代SQL内容。创建sql视图、存储过程等。
发布于 2014-03-18 18:25:24
试试getCommand、setQuery和execute链,如下所示:
IDfApplyExecSQL execSQL = DfAdminCommand
.getCommand(IDfAdminCommand.APPLY_EXEC_SQL);
execSQL.setQuery("UPDATE....");
execSQL.execute(session);如果仍然收到权限消息,则可能会导致SQL服务器或与其连接出现问题。
https://stackoverflow.com/questions/22252909
复制相似问题