![]() ![]() ![]() |
4.1 MIB Overview
4.2 Creating a New MIB
4.3 Adding Imports
4.4 Adding a Scalar
4.5 Adding a Table
4.6 Adding a Trap/Notification
4.7 Adding Constructs Specific to SMIv2
4.8 Creating User Defined Data Type using Textual
Convention
4.9 Converting the MIB Module
4.10 Dragging and Dropping a node
4.11 Parsing MIBs
MIB is a file that contains definitions of management information so that networked systems can be remotely monitored, configured, and controlled. The rules for writing a MIB is defined in a collection of documents called the Structure of Management Information (SMI).
Defining a MIB is the first step towards development of an SNMP Agent. The steps involved in developing a MIB file are:
Data identification : Identify the data or the objects of your device that needs to be managed using SNMP agent and lay them out in the form of scalar or tabular objects .
Data definition (MIB Building): Construct ASN.1 MIB definitions for the objects using the MIB Editor tool in WebNMS Agent Toolkit. The MIB Editor has an easy-to-use wizard interface through which various constructs conforming to SMIv1 and SMIv2 specifications and ASN.1 rules can be created. The wizard interface helps in easy MIB designing by hiding the unimportant details of the MIB syntax rules, clauses etc.
The topics covers creating an SMIv1 and SMIv2 MIB module using MIB Editor tool. You can add Scalars, Tables, Imports, and various constructs conforming to SMI standards to make it a complete MIB. Please go through all the topics for complete knowledge on defining a MIB.
4.2.1 Creating an SMIv1 MIB Module
To create the MIB,
Start the MIB Editor
Select File -> Create MIB from the menu bar or by clicking on the toolbar icon.
Fill in the following details in the wizard that opens up :
Module Name of the MIB (Module name should start with an upper case letter).
Module Directory in which the MIB should be placed.
Version of the MIB (Choose SMI V1) and
Root OID of the MIB
And click OK.
You can see the Parent Node (MIB file name) added under the MIB tree frame in the left side.
4.2.2 Creating an SMIv2 MIB Module
To create the MIB,
Start the MIB Editor
Select File -> Create MIB from the menu bar or by clicking on the toolbar icon.
Fill in the following details in the wizard that opens up :
Module Name of the MIB Module (Module Name should start with an upper case letter).
Module Directory in which the MibModule should be placed.
Version of the MIB (Choose SMI V2) and
The Root OID of the MIB
And click OK.
You can see the Parent Node (MIB file name) added under the MIB tree frame in the left side.
|
Note:
|
Imports specify the items which need to be included from another MIB Module into the Current MIB Module. They are mainly used when an index of another MIB or a Textual Convention of another MIB need to be used. To add imports,
Select Add Imports from the Operations menu in the menu bar or select the icon Add imports to the MIB present in the toolbar.
From the frame that pops up, use the Import MIB button to add MIB(s) from the mibs directory.
Select the MIB which you like to import and click "Load". This loads the respective MIB to the frame.
Click "OK" button which loads it in the MIB tree.
The Indexes and the TCs of this MIB can also be used.
To use the Indexes : While defining a table for the new MIB, index or augments are chosen using Add External Indices/ Augments option. If index is chosen, it helps you to utilize any selected index of the imported MIB. If Augments option is chosen, all the indices under the selected entry will be added from the imported MIB
To use the TCs : While defining an object for the new MIB, the Syntax option combo box includes all the TCs of the imported MIB from which you can choose for the new MIB.
|
Note:
|
Scalar is a leaf node that can hold only a single value. To store single values in the MIB, scalar variables can be used. To add a scalar variable to the MIB,
Select Scalar Object from Operations -> Add Node in the menu bar. The corresponding template appears on the right frame.
Fill in the template with the following details :
Name for the Object Type.
Sub ID of the node (need not be modified).
Parent ID for the Scalar Node (non-editable).
Syntax to be used for the Scalar Node. The "..." button opens up with a wizard to specify the Simple or Value/Range or Enumeration for the syntax chosen. These syntax are explained below in Syntax Definition section below.
Maximum Access for the Node.
Status of the Node.
Description of the Scalar Node (If Required).
Reference for the Scalar Node (If Required).
Format in which the Default Values have to be generated : either Decimal or Binary or Hexa. Just choosing the required format in the combo box will generate default values in that format.
Finally Add to Module and this will add a scalar variable to the MIB module.
Simple option defines the default integer range. Takes the format specified in DefVal.
Enumeration option defines a variable for a particular value. Sample Definition : Value - 1, Label - true. This enumeration can be added to the Syntax type.
Value/Range option enhances you to specify your own range of Integer. The MIB will respond only with the values that lie within the Range.
Read_Only - Access for retrieving values of the node.
Read_Write - Access for retrieving and modifying the values.
Write_Only (only for v1) - Access for modifying the existing values of the node.
Read_Create (only for v2) - Access for retrieving, modifying, and creating the values.
Not_Accessible - Access for not being able to perform any operation on this node.
Accessible for Notify (only for v2) - Access for notifying a significant change in the node.
Mandatory (only for v1) - indicates that the definition is valid and should be implemented.
Current (only for v2) - indicates that the definition is valid currently.
Deprecated - indicates that the definition will soon be made obsolete and need not be implemented.
Obsolete - indicates that the definition is not valid and should not be implemented.
Optional (only for v1) - indicates that the definition is valid and may or may not be implemented.
When a group of information is to be given in the MIB, a table can be used. A table can maintain a row with various columns. Each table has an index column and every row of the table is identified by the index column value. To define a table and add it to the MIB, you will have to define a row entry for the table object first and define one or more columnar objects with at least one index column.
4.5.1 Defining the Table
To add a Table to the MIB, the first step is to define the Table construct. Follow the steps given below for defining the Table.
Select Table Object from the Operations -> Add Node menu bar. The corresponding template appears on the right side frame.
Fill in the template with the following details :
Name for the Object Type.
SubID of the Node (Need not be modified).
Parent OID of the Node.
Syntax Sequence gets loaded automatically as xxxEntry, xxx being the prefix of the table created. This is a special value of the SYNTAX, which indicates that a table object is being defined.
Maximum Access for the node. By default, it will be not-accessible and cannot be configured.
Status of the table node.
Description of the Node, if required.
Reference of the Node, if required.
Finally, Add Table.
4.5.2 Adding Entry to the Table
Once the table is added, the template for adding an entry opens up. To add an entry,
Specify the
Object Type.
Sub ID value (Need not be modified).
Table name
Syntax which is the entry name
Max-Access of the row.
Status of the row.
Description and Reference (If Required) and
External index/indices
can also be added using Add
External Indices/ Augments option. External Index is an index column
from another table added to the table being created. Click the Choose
Index button to add external index to the table. A Select
Node dialog pops up with a list of indices of various tables (if
imported). Select the index columns and click the Add button. The selected
index columns are added as the External index to the table and is visible
only in the MIB tree view.
The Augments
option is disabled, if it is a V1 MIB. Here, all the indices under the
selected entry will be added as external indices. For more details on
External Index, please refer Adding External
Index section given below.
Add the entry using Add Entry option which adds the row to the table.
4.5.3 Adding a Column
Once the entry is added, the columns have to be defined and the template for the same is made available. To add a column to the table,
Specify the following:
Name for the Object Type.
Sub ID of the tabular node (Need not be modified).
Entry of the table.
Index of the table- it should be an Implied Index or an ordinary Index column to the table . For more details on Implied Indexes, refer section Adding Implied Index given below.
Syntax to be used for the table node. The "..." button opens up with a wizard to specify the Simple or Value/Range or Enumeration for the syntax chosen.
Maximum Access for the Node.
Status of the Node.
Description of the Table Node (If Required).
Reference for the Table Node (If Required).
Format in which the default values have to be generated : either Decimal or Binary or Hexa.
And Add Column to Table. Finally, "Add to Module" is chosen which will add the table node under the specified parent ID and display it in the MIB Tree.
|
Note:
Column
->
Index |
4.5.4 Adding Multiple Indexes
This requirement of adding multiple index will arise, when a particular row needs to be identified by two index columns. A table can have any number of index columns and to add multiple indexes to a table, follow the steps given in Adding a Table topic. By checking the Index option for two or more columns in the table, multiple index support is achieved. Apart from multiple indexing, external indexing is also supported that is explained below.
External Indices are indices which are inherited from another table of the same MIB or from a different MIB. The table from which the index has been taken is called as the "Base Table" and the table which has been formed using the index of the Base table is called as the "Derived table".
Hereby, it is clear that the Base Table and the Derived Table are interrelated
Any row can be added to the Derived Table only after specifying the instances of the Base Table.
Adding a row in the Base Table need not necessarily add a row in the Derived Table.
Please note that, a Derived Table can also have additional index columns (local indexes) apart from the Base Table's index column, as every normal table would have.
And, while generating code for an External Index table, the corresponding Base Table has to be included before generation.
For having an External Index in the Table,
Check the Index option that comes while adding entry.
Choose Index is used to choose the External index from the indices listed.
Only when the MIB is imported, will it be shown in External Index UI.
The Augments option is disabled incase of SMI v1 MIBs. It is similar to external index.
Please refer to the topic Adding Entry to the Table given above for the option.
While querying a table, the OID of the column to be queried along with its instance values is given. The length of the Instance value is also specified in cases where the Syntax is of STRING types like OCTET-STRING, OID, Display String. In case, Implied Index support is availed, the length need not be specified. For a Table to have an Implied Index,
Check the Implied Index option that comes across Index while Adding a Column to the Table. Please refer to the topic Adding a Column given above for the option.
|
Note:
|
Row Status is a Textual Convention (TC) defined by the SNMPv2-TC MIB. This support enables to add and delete rows in SNMPv2 tables from the management stations, at ease. This is one among the syntax provided by v2c agents. Hence, while defining a column this syntax option can be chosen. The status of whether the row is active or not-in-service etc., can be known here. The status can be any one among the following : -
active (1)
notInService (2)
notReady (3)
createAndGo (4)
createAndWait (5)
destroy (6)
To add a row to a table having Row Status column, please refer to Using Row Status under Testing the Agent section.
4.6 Adding a Trap/Notification
To notify the significant change in the state of a scalar or tabular variable, a trap or notification has to be defined for that particular variable. To define a Trap Type construct (for SMI V1) or Notification Type Construct (for SMI V2), please follow the steps given below.
4.6.1 Adding a Trap
Select an OID.
Add Trap Type, using Trap Type Construct from the Operations -> Add Node menu bar.
A Template opens up wherein the following details need to be filled in for Trap Type Construct :
Trap Type : The first 6 Trap types mentioned here are of Generic Type and are defined by the snmp group of MIB-II.
coldStart : coldStart traps indicate that a device has just powered up or has reinitialized completely (hard-reset). The configuration of the device may have changed and any data collected prior to the reset may have been lost.
warmStart : The warmStart is an indication that device has reinitialized but neither the device configuration nor the stored data gets changed. The device is expected to continue in the same state as seen before the reinitialization.
linkDown : The linkDown trap is an indication that a communication link or a port on a network node has failed.
linkUp : A linkUp trap is an indication that a communications link or a port on a node has come up after the failure and is ready for service.
authenticationFailure : The authenticationFailure trap indicates that an agent has received an SNMP message that cannot be authenticated. This is typically an indication that the SNMP PDU contained an unrecognized community name, or that the message was sent from a node residing at an network address not authorized to send SNMP requests to the agent.
egbNeighborLoss : The agent is reporting that the peer relationship between an External Gateway Protocol (EGP) neighbor and an EGP peer no longer exists.
enterprisespecific : This trap is used to define all events other than the six generic traps specified above. An "enterprise specific trap" is indicated by a value other than "snmp" for the ENTERPRISE field. The sending agent has detected an enterprise-specific event. The value of the specific trap type field indicates the nature of the event.
Enterprise : A Trap message is identified by the value in this Enterprise field. If the value specified is SNMP(.1.3.6.1.2.1.11), then the value is for generic-trap. Generic-traps are defined traps and so you need not define them. Otherwise, they are specific-traps. You can define Specific from the listed entries.
Variables : Used to specify one or more scalar or columnar objects whose value describes the event. The variables are listed by pressing the Var button.
Description and Reference: Trap Type can be specified, if required.
Sub ID for Trap Type construct (Need not be modified).
Finally, Add to Module.
The construct gets added to the MIB and is displayed in the MIB Tree in the left hand side.
4.6.2 Adding a Notification
Select an OID/ ModuleIdentity/ ObjectIdentity.
Add Notification Type, using Notification Type Construct from the Operations -> Add Node menu bar.
A Template opens up wherein the following details need to be filled in for Notification Type Construct :
The Template for Notification Type includes :
Name of the Notification Type.
Sub ID of the Notification (Need not be modified).
Parent OID of the Notification Type.
Status of the Notification - Current / Deprecated / Obsolete.
Scalar and Tabular Objects for which notification has to be generated. These objects need to be browsed and chosen.
Description and Reference for the Notification Type can be given, if required.
Finally click Add to Module to add the Notification.
|
Note: The Notification-Group construct is used in SMI v2 MIB modules to define a collection of related event definitions. The grouping is done to show the logical grouping of events as a hint for the Agent and Management Application designers/developers. At least a single Notification Type should be present in a Notification Group. |
4.7 Adding Constructs Specific to SMIv2
4.7.1 Object Group
The OBJECT-GROUP construct is used to define a collection of related object type definitions. These object type may be a member of more than one object group. At least a single Object Type should be present in the Object group. This grouping is done by the MIB Module authors to show the logical grouping of object types and to help agent and management application developers. Only the object types defined in the same MIB Module may be members of the OBJECT GROUP.
To add this construct,
Select a Node.
Add Object Group from the Operations -> Add Node menu bar.
The corresponding template opens for the details to be filled in for the following :
Name of the Object Group.
SubID of the Group (Need not be modified).
Parent ID of the Group.
Objects to be present in the Group.
Status of the Group.
Description and Reference for the Node, if required.
Finally, Add to Module. The construct gets added in the MIB Tree.
4.7.2 Object Identity
The OBJECT-IDENTITY construct is used to assign an OID value to an identifier in the MIB module. The OID value assigned should be unique. To add an Object Identity to the V2 MIB,
Select Object Identity from the Operations -> Add Node menu bar.
The corresponding template opens up with the following details to be filled in,
Name of the Object Identity.
Sub ID for the Node (Need not be modified).
Parent ID of the node.
Status of the Node. It can be deprecated, current, or obsolete.
Description and Reference can be given for the node, if required.
Finally, Add to Module.
This will include the Object Identity in the tree.
4.7.3 Module Compliance
The MODULE-COMPLIANCE construct is used in SMI v2 MIB Modules to define implementation requirement specifications for agents. A requirement specification names groups of object types / events to be implemented. One or more requirement specifications may be defined within a MIB module. It may refer to the items defined in the containing MIB module and/or in other MIB Modules.
Currently, the primary use of the MODULE-COMPLIANCE construct is to allow the MIB module author to specify the minimal list of object types and events defined in the containing MIB module that an agent developer must implement. The construct consists of a header, followed by a list of MIB module requirement specifications. Within a MIB module requirements specification, we have a list of groups which are unconditionally required, followed by a list of conditionally required groups and exception specifications.
To define the construct,
Select Module Compliance icon from the Operations -> Add Node menu bar.
The respective template opens up with the following details to be filled in.
Name of the node to be created to define this construct.
Sub ID of the construct (Need not be modified).
Parent ID of the construct.
Status of the definition. It can be Current, Deprecated, or Obsolete.
Textual description of the node or item being defined.
Reference to specify the source of the definition.
Clicking the View Module Compliance Definition button and clicking New Button in it, will open up a wizard in which the values for Module and Mandatory groups are entered.
The MODULE sub-clause specifies the module identifier and by convention the name should start with an uppercase letter. Specify a Mandatory Group also.
When you "Add" these details you can find the Module Compliance with two groups namely Groups and Objects. Selecting Group and clicking the New button enables the group details.
GROUP : The GROUP clause is used to specify a conditionally required object or notification group. The DESCRIPTION clause, which is paired with the GROUP clause specifies the conditions when the group is required. A group may not be specified in the MANDATORY-GROUPS clause and in a GROUP clause. Also, a group may not be specified in two different GROUP clauses. The description clause describes the group description.
Here again "Add" , which will add the details under the Group.
On selecting Object and clicking New button, the details required for the Object get enabled.
OBJECT: The OBJECT clause and its associated clauses specify reductions in required behaviors of an object to meet a requirements specifications. This is typically used to specify that an implementation of a table need not support row creation to meet a requirements specification, even though the definition of the table defines row creation. This is accomplished by specifying that the minimum required value for access is either read-write or read-only instead of read-create in the MIN-ACCESS clause.
MIN-ACCESS: The MIN-ACCESS clause can also be used to specify that an object in an object group need not be implemented. This is done by specifying the value of not-accessible for the MIN-ACCESS clause. The value of accessible-for-notify is used to indicate that only an object needs to be present to return an instance in an event.
SYNTAX & WRITE-SYNTAX: The purpose of SYNTAX and WRITE-SYNTAX clauses is to specify a reduction in the implemented behavior of an object.
DESCRIPTION: The DESCRIPTION clause associated with SYNTAX clause specifies the reduction in required behaviors of SYNTAX clause. The DESCRIPTION clause associated with GROUP clause, specifies the conditions when the group is required.
Finally, press Finish button to return to the initial screen and
Click Add to Module button.
The Module Compliance construct is successfully added in the Mib tree.
4.7.4 Agent Capabilities
The AGENT-CAPABILITIES construct is used in SMI v2 MIB Modules to specify the implementation characteristics of an SNMP Agent sub-system with respect to object types and events. The term "implement" means that the agent provides all defined behaviors of these items, unless documented by exception clauses in the AGENT CAPABILITIES construct.
To define the construct,
Select Agent Capabilities from the Operations -> Add Node menu bar.
Enter the following details in the template that appears on the right frame :
Name of the node to be created to define this construct.
Sub ID of the construct (Need not be modified).
Parent ID of the construct.
PRODUCT RELEASE to describe the product release which includes the implemented capabilities.
Status of the definition. It can be Current, Deprecated, or Obsolete.
Description and Reference for the construct, if required.
On clicking View Agent Capabilities icon you get a template to be filled in with details :
SUPPORTS: Supports subclass specifies the module identifier. By default, it should start with upper case letters.
INCLUDES: The INCLUDES clause specifies object and event groups that an agent implements. Unless specified in a VARIATION clause, an agent fully implements all the behaviors specified in the definitions of the objects and/or events that are members of the groups in the INCLUDES clause.
Press "Add" button and the screen reflects the additions.
Select the newly created item in the left frame and press New button.
The text boxes Variation, Syntax, Write Syntax, Access, Creation Requires, Deferral, and Description gets enabled.
VARIATION: The VARIATION clause may be used to specify a change of behavior of an event or object, or to specify that an event/object is not implemented. The ACCESS clause with a value of not implemented is used for the latter case. This is the only clause other than DESCRIPTION that may be specified for an event variation.
SYNTAX & WRITE SYNTAX: The purpose of SYNTAX and WRITE SYNTAX clauses is to specify a reduction in the implemented behavior of an object.
CREATION REQUIRES: The CREATION REQUIRES clause is used to document the objects that are required in a single SET operation to create an instance of a row in a table.
DEFVAL: The DEFVAL clause specifies a default value that an agent uses when an instance of a columnar object is created, instead of that specified in the definition of the object.
Finally, press Finish button to return to the initial screen and
Click Add to Module button.
The Agent Capabilities Compliance construct is successfully added in the Mib tree.
4.8 Creating User Defined Data Type using Textual Convention
TEXTUAL CONVENTION constructs are used to create new Data Types. This is done by allowing restrictions on an existing base type or previously created TEXTUAL CONVENTIONS. Textual conventions are nothing but redefined data type. To define the construct,
Select Textual Convention from the Operations -> Add Node menu bar and enter the following details in the template :
Name of the TEXTUAL- CONVENTION. Please note that the name has to start with Upper case letter.
SYNTAX Type for the TC. Add any one of the SNMP Base Data Type.
Also fill in details for the Display Hint, Status, Description and Reference fields.
And Add to Module.
The Textual Convention is added and displayed in the MIB tree of the left frame. Note that the defined TC cannot be modified or deleted.
To convert a MIB module,
Select File -> Convert MIB option from the menu bar which converts the MIB module from SMI v1 to SMI v2 or vice versa.
Also Save as option from the File in menu bar can be used for saving MIB Module. It can also be used for saving the MIB in the required location in the preferred name.
4.10 Dragging and Dropping a Node
The MIB Editor application facilitates dragging and dropping of nodes. You can drag a node from one group, drop it into another group and save the MIB to store the changes. Dragging and Dropping of a scalar group or a tabular group or a combination of both onto an Object Identifier (in case of v1 and v2) and Module Identity (in case of v2) is possible. You can also move the child node of a parent to another parent node.
|
Note: It is not possible to drag and drop a Trap/Notification and a Textual Convention. You cannot move a Module Identity either under its child node or its parent node. |
While loading MIB files in MIB Editor, it performs the following operations.
Parsing and validating the syntax of the MIB module
Constructing the MIB module into the tree structure
While performing the parsing and validation of the MIB files, if the MIB modules fail to conform to the SMI standards the loading will not be done. However, the Editor application requirements might mandate the loading of the non-standard files. On the other hand, some applications might require a stricter check on the compliance to the standards.
The parsing and validating syntax of the MIB file can be configurable. Agent Toolkit provides the following set of parsing levels which facilitates to select the level of parsing required by the Mib Editor application.
Lenient
Normal
Serious
Critical
In the Mib Editor application, parsing level has to be set first before loading a MIB. This level, once set, is used for subsequent MIBs that are loaded. If the level needs to be modified for the next set of MIBs loaded, it has to be set again.
Constructing the MIB Module into the Tree Structure
If parsing is completed successfully, the API resolves the parent and child nodes in the current module. If there are any unresolved nodes, it tries to load from the imported module that is defined in the IMPORTS section. If the unresolved object is not present even in the imported module, unresolved TC construct {objectName1, objectName2, ...} exception is thrown.
If the parsing level is NORMAL, SERIOUS, or CRITICAL, and if the MIB file contains errors, then the compiled files (cmi and cds files) or the serialized files (ser files) will not be created.
Checks for Various Parsing Levels
The following tables describes the different levels of parsing that can be set and their corresponding checks.
S.No. |
Level of Parsing |
Checks |
Description |
---|---|---|---|
1 |
Lenient |
No Checks |
This level accepts all types of MIB files. For example, it allows both SMIv1 and v2. |
2 |
Normal |
Default checks |
This level is the default level conforming to the obsolete standards, such as RFC 1902, RFC 1903, etc. Most MIBs follow the obsolete standard. |
3 |
Serious |
Serious Checks |
This level strictly follows the current standard. It accepts the constructs with inter-operability and implementation problems. |
4 |
Critical |
Critical Checks |
This level completely follows the SMIv1 and v2 standards. However, it does not accept the backward compatibility constructs, constructs with inter-operability and implementation problems, etc. |
Normal Parsing Level
When the parsing level is normal (default parsing level), the following checks are included.
OBJECT_IDENTIFIER_CONSTRUCT
CHECK_DEFAULT
Serious Parsing Level
When the parsing level is serious, the following checks are done in addition to Normal checks.
IMPORTS_CONSTRUCT
MODULE_IDENTITY_CONSTRUCT
OBJECT_TYPE_CONSTRUCT
TRAP_TYPE_CONSTRUCT
NOTIFICATION_TYPE_CONSTRUCT
TEXTUAL_CONVENTION_CONSTRUCT
Critical Parsing Level
When the parsing level is critical, the following checks are done in addition to Serious checks.
AGENT_CAPABILITIES_CONSTRUCT
OBJECT_GROUP_CONSTRUCT
NOTIFICATION_GROUP_CONSTRUCT
OBJECT_IDENTITY_CONSTRUCT
MODULE_COMPLIANCE_CONSTRUCT
CHECK_IDENTIFIERS
When the parsing level is Lenient, none of the above checks are done.
There are some rules that a MIB file should follow, without which the MIB tree is not formed properly. When the parser encounters such violations, MibException is thrown.
The OID construct should contain atleast two suboids.
The second and its subsequent suboids should be number or nameNumber to identify their ancestors and their position in the MIB tree.
In the OBJECT_IDENTIFIER construct, if the first suboid is a number, it should be 0. 1, or 2. If the suboid is a name Number, it should be ccit(0), iso(1), or joint-iso-ccit(2).
The label of the last suboid should be same as the descriptor.
The table entry should be the first child of the table node.
The table entry should be defined as a child of the corresponding table object.
The module name of the MIB file should start with uppercase letter.
The TC name should not start with lowercase letter.
Therefore, the following checks are done even when the parsing level is set to lenient. These checks are termed as "Very Critical Checks" and are done irrespective of the parsing level.
CHECK_ATLEAST_TWO_SUBOID
CHECK_SECOND_SUBOID
CHECK_FIRST_SUBOID
CHECK_LAST_SUBOID
CHECK_ROW_OBJID
CHECK_WRONG_TABLE_OBJECT
VALIDATE_MODULE_NAME
VALIDATE_TC_NAME
![]() ![]() ![]() |