QSYS.LIB库中枚举全对象的单一数据源及无*ALLOBJ权限查询方案
好问题!在IBM i(原AS/400)环境里,确实存在单一的系统视图能覆盖你要的所有对象类型查询需求,而且完全可以在不持有*ALLOBJ权限的前提下获取文件名和对象类型,针对PGM专属源的场景也有可行的关联查询方案。
1. 单一信息源:QSYS2.SYSOBJECTS 视图
QSYS2.SYSTABLES只聚焦于表类对象(PF、LF等),但QSYS2.SYSOBJECTS是系统提供的更全面的视图,几乎涵盖了IBM i上所有对象类型——包括你提到的PGM、SRVPGM、DTAQ、DTAARA,当然也包含PF、LF这类文件对象。
要查询特定库(比如MYLIB)下的所有对象名称和类型,直接执行以下SQL即可:
SELECT OBJECT_NAME, OBJECT_TYPE FROM QSYS2.SYSOBJECTS WHERE OBJECT_SCHEMA = 'MYLIB';
返回结果里的OBJECT_TYPE字段会明确标识对象类型,比如*PGM(程序)、*SRVPGM(服务程序)、*DTAQ(数据队列)、*DTAARA(数据区)、*FILE(文件,包含PF/LF)等。
2. 无需*ALLOBJ权限的实现方式
完全可以!你只需要满足两个基础权限:
- 对目标库(比如
MYLIB)拥有*EXECUTE权限(这是访问库内对象的基础权限) - 对
QSYS2.SYSOBJECTS视图拥有*USE权限(默认情况下,普通用户都具备这个权限)
需要注意的是:如果你对库内某个具体对象没有访问权限(比如没有*USE权限),该对象不会出现在查询结果里,但这不影响你查询有权限访问的对象的名称和类型——全程不需要*ALLOBJ这种高权限。
3. PGM专属源文件的查询方案
针对仅含PGM专属源的场景,QSYS2.SYSOBJECTS本身不包含源文件信息,但可以通过关联QSYS2.PGM_INFO视图来获取程序对应的源文件和源库信息。
举个查询MYLIB库下所有PGM的源文件信息的例子:
SELECT o.OBJECT_NAME AS PGM_NAME, o.OBJECT_TYPE, p.SOURCE_FILE AS PGM_SOURCE_FILE, p.SOURCE_LIBRARY AS PGM_SOURCE_LIB FROM QSYS2.SYSOBJECTS o JOIN QSYS2.PGM_INFO p ON o.OBJECT_SCHEMA = p.LIBRARY_NAME AND o.OBJECT_NAME = p.PGM_NAME WHERE o.OBJECT_SCHEMA = 'MYLIB' AND o.OBJECT_TYPE = '*PGM';
这个查询能直接拿到每个PGM对应的源文件名和所在库,前提是你对QSYS2.PGM_INFO视图有*USE权限,且对目标PGM拥有至少*USE权限。
如果需要查询服务程序(SRVPGM)的源信息,可以用QSYS2.SRVPGM_INFO视图,关联逻辑和上面类似。
内容的提问来源于stack exchange,提问作者im_infamous

