【问题标题】:Raw SQL in DFC (Documentum)DFC 中的原始 SQL (Documentum)
【发布时间】:2014-04-10 18:24:04
【问题描述】:

在 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 的安全模型。我也知道我可以在我的 Java 代码中使用@SuppressWarnings("deprecation"),但这并没有减少该方法的弃用。

【问题讨论】:

    标签: java documentum dfc


    【解决方案1】:

    您可以像 Documentum Content Server 一样支持直接连接到您的 sql 服务器。并在这些连接中执行您的 sql 语句。 另一件事是找到一种方法用其他东西代替你的 SQL 东西。创建sql视图、存储过程等。

    【讨论】:

    • 但是如果 DFC 客户端无法直接访问 DB 服务怎么办?这通常是这种情况(只有特权客户端——比如内容服务器——可以连接到数据库,或者数据库在另一个网段上,等等)。这也是一种“更令人沮丧”的方式来做这件事,但 CS 应该真正访问数据库。但是感谢您的回复,这无疑是一种创造性的方法,我没有想到在某些情况下可能会奏效。
    【解决方案2】:

    我自己研究了这个并反编译了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());
        }
        ...
    }
    

    (可能应该将其重组为静态实用程序类或任何首选。)

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

    【讨论】:

      【解决方案3】:

      试试getCommandsetQueryexecute 链,如下所示:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-26
        • 2013-10-31
        • 2012-06-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多