非INDEX子句的NOT-ACCESSIBLE列对象合规吗?编译报错求解答
MIB表中非索引NOT-ACCESSIBLE列的合规性与编译错误解析
核心结论
RFC2578允许表中存在不属于INDEX子句的NOT-ACCESSIBLE列,这类列仅用于设备内部逻辑,无需对外暴露访问能力。你遇到的编译错误并非因为这类列被禁止,而是表项定义的顺序或结构不符合规范。
错误原因分析
MIBExplorer-light的报错sequence clause of the table entry definition xXX at line NN, column xx does not match the order or number of objects registered for that table at entry xXX,本质是表项的SEQUENCE定义与实际列对象的注册顺序/数量不匹配。
根据RFC2578第7.7节(Table Definitions)的要求,表项的SEQUENCE必须严格遵循以下顺序:
- 所有INDEX子句中定义的列对象(按INDEX的顺序排列)
- 所有可访问的列对象(MAX-ACCESS为read-only、read-write等类型)
- 所有NOT-ACCESSIBLE的列对象(必须放在最后)
如果NOT-ACCESSIBLE列被插入到INDEX列或可访问列之前,或者列对象的顺序与SEQUENCE定义不一致,编译器就会判定结构不匹配,抛出上述错误。
解决步骤
- 调整列对象的顺序:打开你的MIB文件,找到报错的表项定义,确保SEQUENCE中的对象顺序严格遵循「INDEX列 → 可访问列 → NOT-ACCESSIBLE列」的规则。
- 校验列对象的绑定关系:确认每个列对象的
::= { tableEntry N }中的编号与SEQUENCE里的顺序一一对应(INDEX列对应第一个编号,依次往后)。 - 排除INDEX子句错误:确保NOT-ACCESSIBLE列没有被错误地包含在INDEX子句中,INDEX只能包含可访问的列对象(MAX-ACCESS不能是not-accessible)。
正确示例
以下是符合规范的MIB表定义示例:
-- 表定义 myDeviceTable OBJECT-TYPE SYNTAX SEQUENCE OF MyDeviceEntry MAX-ACCESS not-accessible STATUS current DESCRIPTION "Table of device internal data." ::= { myDeviceMIB 1 } -- 表项定义 myDeviceEntry OBJECT-TYPE SYNTAX MyDeviceEntry MAX-ACCESS not-accessible STATUS current DESCRIPTION "A row in the device table." INDEX { deviceIndex } -- 仅包含可访问的索引列 ::= { myDeviceTable 1 } -- 表项SEQUENCE(顺序严格合规) MyDeviceEntry ::= SEQUENCE { deviceIndex INTEGER, -- INDEX列,放在最前 deviceName OCTET STRING, -- 可访问列 deviceStatus INTEGER, -- 可访问列 internalCounter INTEGER -- NOT-ACCESSIBLE列,放在最后 } -- 列对象定义,编号与SEQUENCE顺序对应 deviceIndex OBJECT-TYPE SYNTAX INTEGER MAX-ACCESS read-only STATUS current DESCRIPTION "Index for the device table." ::= { myDeviceEntry 1 } deviceName OBJECT-TYPE SYNTAX OCTET STRING MAX-ACCESS read-only STATUS current DESCRIPTION "Name of the device." ::= { myDeviceEntry 2 } deviceStatus OBJECT-TYPE SYNTAX INTEGER { up(1), down(2) } MAX-ACCESS read-only STATUS current DESCRIPTION "Operational status of the device." ::= { myDeviceEntry 3 } internalCounter OBJECT-TYPE SYNTAX INTEGER MAX-ACCESS not-accessible STATUS current DESCRIPTION "Internal counter for device logic, not accessible via SNMP." ::= { myDeviceEntry 4 }
内容的提问来源于stack exchange,提问作者Gerhard Pobinger
相关产品推荐
相关产品推荐

