【问题标题】:Semi-dynamic queries and database security半动态查询和数据库安全
【发布时间】:2019-03-05 11:59:44
【问题描述】:

我知道带有静态缓冲区、查找、for each 等的普通 Progress 4GL 代码在编译时(或在运行时使用“使用运行时权限检查”选项另外)受到数据库安全性的影响。

动态查询仅在运行时受数据库安全性约束。

有谁知道下面示例中的代码的行为方式?

define query q for OrderLine.

DEFINE VARIABLE hQuery AS HANDLE NO-UNDO.

hQuery = QUERY q:HANDLE.

hQuery:QUERY-PREPARE("FOR EACH OrderLine NO-LOCK WHERE OrderLine.Itemnum = 100":U).
hQuery:QUERY-OPEN().

get first q.
do while available OrderLine:

  display OrderLine.Qty.

  get next q.

end.

close query q.

【问题讨论】:

    标签: openedge progress-4gl progress-db


    【解决方案1】:

    QUERY-PREPARE() 和 QUERY-OPEN() 在运行时执行,编译器无法在编译时评估参数是什么,因此运行时是应用安全性的时间。

    (即使您使用静态字符串作为参数,编译器也不够聪明,无法用它做任何事情。)

    【讨论】:

    • 我没想到编译器会在编译时评估查询准备字符串。我感兴趣的是,如果为固定表定义查询 q 并通过 get first/next q 访问查询,并且固定表的名称会做任何事情。显然,如果查询准备字符串与查询的定义不匹配,则代码将不起作用。刚刚尝试了在这种情况下会发生什么,查询准备将抛出错误“ must be an unabbeviated name of a buffer known in query q. (7327)”。
    • 在您尝试执行查询之前不会应用安全性。 “FOR orderLine”不会影响这一点。所以它仍然是运行时的。
    猜你喜欢
    • 2018-06-18
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    • 2010-10-24
    • 2010-10-16
    • 2016-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多