eiv*_*amu 6 java documentum dfc
在DFC中,可以使用该IDfSession.apiExec()方法直接执行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);
Run Code Online (Sandbox Code Playgroud)
这工作正常,但已经提到过apiExec不推荐使用.
我也尝试了另一种方法:
(...)
IDfQuery query = new DfQuery(sql);
query.execute(session, IDfQuery.DF_EXEC_QUERY);
Run Code Online (Sandbox Code Playgroud)
据我所知,这应该有效,但我不断收到以下信息:
[DM_QUERY_E_REG_TABLE_PERMIT_IN]error: "You have insufficient privilege to UPDATE the dbo.dm_sysobject_s table."
Run Code Online (Sandbox Code Playgroud)
我在使用时收到相同的错误消息IDfQuery.DF_QUERY,但无论如何DF_EXEC_QUERY是应该工作的那个 - 或者?我当然是用超级用户帐户来尝试这个,所以我不知道我缺少哪些权限.
是否有一种好的,不推荐的方式从DFC中执行原始SQL语句?
我还想补充一点,我是非常清楚的原始SQL是强烈反对,因为它绕过的Documentum的安全模型.我也知道我可以@SuppressWarnings("deprecation")在我的Java代码中使用,但这并没有使该方法不再被弃用.
我自己研究了一下并反编译了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());
}
...
}
Run Code Online (Sandbox Code Playgroud)
(人们可能应该将其重组为静态 util 类或任何首选的类。)
这里最关键的部分当然是调用DmclApi.getInstance().exec()。apiExec()这是一个丑陋的黑客,但在我看来并不比原来的更糟糕。这确实是一个重新实现。
| 归档时间: |
|
| 查看次数: |
2637 次 |
| 最近记录: |