首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DFC (Documentum)中的原始SQL

DFC (Documentum)中的原始SQL
EN

Stack Overflow用户
提问于 2014-03-07 14:33:12
回答 3查看 3.5K关注 0票数 6

在DFC中,可以使用IDfSession.apiExec()方法直接执行SQL (绕过DQL)。问题是该方法在当前(6.x,7.x)版本的DFC API中被标记为不推荐使用。

下面是一些使用不推荐方法的示例代码:

代码语言:javascript
复制
IDfSession session;
(...)
String sql = "UPDATE dm_sysobject_s SET r_modifier = 'hacker' WHERE r_object_id = '<some_id>'";
session.apiExec("execsql", sql);

这很好,但是正如前面提到的,不推荐使用apiExec

我也尝试过另一种方法:

代码语言:javascript
复制
(...)
IDfQuery query = new DfQuery(sql);
query.execute(session, IDfQuery.DF_EXEC_QUERY);

据我所知,这应该是可行的,但我一直得到以下信息:

代码语言:javascript
复制
[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")代码中使用,但这并不会使这个方法不那么受欢迎。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-03-10 12:16:29

我亲自调查了这个问题,并对DfSession进行了分解。在apiExec()方法中,DFC使用“局外人”可用的一些内部调用,这使您可以创建自己的"apiExec()等效“。

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

代码语言:javascript
复制
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()更糟糕。这是一个重新实现,真的。

票数 1
EN

Stack Overflow用户

发布于 2014-03-07 15:29:31

可以支持与sql服务器的直接连接,如。并在这些连接中执行sql语句。另一件事是找到一种方法,用smth来替代SQL内容。创建sql视图、存储过程等。

票数 1
EN

Stack Overflow用户

发布于 2014-03-18 18:25:24

试试getCommandsetQueryexecute链,如下所示:

代码语言:javascript
复制
IDfApplyExecSQL execSQL = DfAdminCommand
        .getCommand(IDfAdminCommand.APPLY_EXEC_SQL);
execSQL.setQuery("UPDATE....");
execSQL.execute(session);

如果仍然收到权限消息,则可能会导致SQL服务器或与其连接出现问题。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22252909

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档