任务和传感器的操作

任务或传感器的操作是用于执行一个或多个操作的 SQL 语句或例程。

如果操作中仅包含单个操作,SQL 语句很有用。 如果操作中包含多个操作,使用 C 或 Java™ 编写的存储过程或用户定义的例程很有用。操作存储在 ph_task 表的 tk_execute 列中。

创建操作时具有很高的灵活性。 操作类型可包括:

请在任务或传感器操作中使用以下变量:

示例

以下操作是使用的 SQL 语句,供内置 mon_command_history 任务用于从 command_history 表中除去较旧的行。
DELETE FROM command_history
WHERE cmd_exec_time < (
SELECT CURRENT - value::INTERVAL DAY to SECOND
FROM ph_threshold
WHERE name = 'COMMAND HISTORY RETENTION' )
以下示例描述的是 SQL 语句,供内置 mon_vps 传感器用于向 mon_vps 结果表添加数据:
INSERT INTO mon_vps 
SELECT $DATA_SEQ_ID, vpid, num_ready, 
class, usecs_user, usecs_sys 
FROM sysmaster:sysvplst
以下示例描述的是存储过程,用于终止空闲时间超过了阈值设置值的用户会话,并且向 ph_alert 表添加警报。
/*
 **************************************************************
 *  Create a function that will find all users that have 
 *   been idle for the specified time. Call the SQL admin API to
 *   terminate those users.  Create an alert to track which
 *   users have been terminated.
 **************************************************************
 */
CREATE FUNCTION idle_timeout( task_id INT, task_seq INT)
RETURNING INTEGER

DEFINE time_allowed INTEGER;
DEFINE sys_hostname CHAR(16);
DEFINE sys_username CHAR(257);
DEFINE sys_sid      INTEGER;
DEFINE rc           INTEGER;

    {*** Get the maximum amount of time to be idle ***}
    SELECT value::integer 
	  INTO time_allowed 
	  FROM ph_threshold 
          WHERE name = "IDLE TIMEOUT";

    {*** Find all users who are idle longer than the threshold ***}
    FOREACH SELECT admin("onmode","z",A.sid), A.username, A.sid, hostname
           INTO rc, sys_username, sys_sid, sys_hostname
           FROM sysmaster:sysrstcb A , sysmaster:systcblst B,
                sysmaster:sysscblst C
           WHERE A.tid = B.tid
           AND C.sid = A.sid
           AND lower(name) in  ("sqlexec")
           AND CURRENT - DBINFO("utc_to_datetime",last_run_time) > time_allowed UNITS MINUTE
           AND lower(A.username) NOT IN( "gbasedbt", "root")

           {*** If a user is successfully terminated, log ***}
           {*** the information into the alert table.    ***}
           IF rc > 0 THEN
               INSERT INTO ph_alert
                  (
                   ID, alert_task_id,alert_task_seq,
                   alert_type, alert_color,
                   alert_state,
                   alert_object_type, alert_object_name,
                   alert_message,
                   alert_action
                  ) VALUES (
                   0,task_id, task_seq,
                   "INFO", "GREEN",
                   "ADDRESSED",
                   "USER","TIMEOUT",
		   "User "||TRIM(sys_username)||"@"||TRIM(sys_hostname)|| 
			    " sid("||sys_sid||")"|| 
                            " terminated due to idle timeout.",
                   NULL
                  );
          END IF

   END FOREACH;

   RETURN 0;

END FUNCTION;