您好,我是小DAI,专注于数据库管理员相关的技术问答,请问有什么可以帮您?

内置库 SQLSCRIPT_LOGGING

SQLSCRIPT_LOGGING 支持对各种类型的 SQLScript 对象(包括过程、表函数和 SQLScript 库)进行用户级别跟踪。

接口

代码语法CREATE LIBRARY SQLSCRIPT_LOGGING AS BUILTIN BEGIN PUBLIC VARIABLE LEVEL_FATAL CONSTANT VARCHAR(5) = 'fatal'; PUBLIC VARIABLE LEVEL_ERROR CONSTANT VARCHAR(5) = 'error'; PUBLIC VARIABLE LEVEL_WARNING CONSTANT VARCHAR(7) = 'warning'; PUBLIC VARIABLE LEVEL_INFO CONSTANT VARCHAR(4) = 'info'; PUBLIC VARIABLE LEVEL_DEBUG CONSTANT VARCHAR(5) = 'debug'; PUBLIC PROCEDURE CREATE_CONFIGURATION(CONFIGURATION_NAME VARCHAR(32)); PUBLIC PROCEDURE DROP_CONFIGURATION(CONFIGURATION_NAME VARCHAR(32)); PUBLIC PROCEDURE SET_OUTPUT_TABLE(CONFIGURATION_NAME VARCHAR(32), SCHEMA_NAME NVARCHAR(256), TABLE_NAME NVARCHAR(256)); PUBLIC PROCEDURE SET_LEVEL(CONFIGURATION_NAME VARCHAR(32), LEVEL VARCHAR(7)); PUBLIC PROCEDURE START_LOGGING(CONFIGURATION_NAME VARCHAR(32)); PUBLIC PROCEDURE STOP_LOGGING(CONFIGURATION_NAME VARCHAR(32)); PUBLIC PROCEDURE ADD_SQLSCRIPT_OBJECT(CONFIGURATION_NAME VARCHAR(32), SCHEMA_NAME NVARCHAR(256), OBJECT_NAME NVARCHAR(256)); PUBLIC PROCEDURE REMOVE_SQLSCRIPT_OBJECT(CONFIGURATION_NAME VARCHAR(32), SCHEMA_NAME NVARCHAR(256), OBJECT_NAME NVARCHAR(256)); PUBLIC PROCEDURE SET_FILTER(CONFIGURATION_NAME VARCHAR(32), TYPE VARCHAR(16), ...); PUBLIC PROCEDURE ADD_FILTER(CONFIGURATION_NAME VARCHAR(32), TYPE VARCHAR(16), ...); PUBLIC PROCEDURE REMOVE_FILTER(CONFIGURATION_NAME VARCHAR(32), TYPE VARCHAR(16), ...); PUBLIC PROCEDURE UNSET_FILTER(CONFIGURATION_NAME VARCHAR(32), TYPE VARCHAR(16)); PUBLIC PROCEDURE LOG(LEVEL VARCHAR(7), TOPIC VARCHAR(32), MESSAGE NVARCHAR(5000), ...);END;

描述

日志记录

具有 LOG() 的 SQLScript 对象称为日志记录对象。日志消息可按其主题进行分类。

过程描述LOG (LEVEL, TOPIC, MESSAGE, ...)如果存在启用日志的配置,则会在输出表中插入格式化日志消息。调用用户应对当前对象具有 SQLSCRIPT LOGGING 权限。保存日志消息需要配置,否则将忽略日志记录。限制在标量用户定义的函数和自主事务块中不可用。 

配置

配置是为日志记录设置设计的虚构对象。它不是持久性对象,仅持续到最外层语句的执行结束。日志记录的所有设置都可以由配置控制。至少需要 1 个配置才能保存日志消息,一次最多可以存在 10 个配置。

过程描述CREATE_CONFIGURATION (CONFIGURATION_NAME)使用给定名称创建配置的构造函数。CONFIGURATION_NAME 在整个执行期间应唯一。DROP_CONFIGURATION (CONFIGURATION_NAME)用于移除具有给定名称的配置的析构函数。当最外层语句完成其执行时,将自动销毁所有配置。SET_LEVEL (CONFIGURATION_NAME, LEVEL)这是必需的配置设置。日志记录库写入级别高于(较低详细级别)的日志。级别(从不太详细到更详细)为:致命、错误、警告、信息、调试 

SQLScript 对象

SQLSCRIPT_LOGGING 支持过程、表函数和 SQLScript 库。SQLScript 对象需要注册到配置,以便从对象中收集日志。仅支持按对象进行配置,库的成员设置不可用。

过程描述ADD_SQLSCRIPT_OBJECT(CONFIGURATION_NAME、SCHEMA_NAME、OBJECT_NAME)选择加入以从 对象收集日志。它需要对象的 SQLSCRIPT LOGGING 权限。最多可以向单个配置添加 10 个对象。REMOVE_SQLSCRIPT_OBJECT(CONFIGURATION_NAME、SCHEMA_NAME、OBJECT_NAME)用于从对象收集日志的选择退出 

输出表

来自日志记录对象的日志消息将插入到输出表中。

过程描述SET_OUTPUT_TABLE(CONFIGURATION_NAME、SCHEMA_NAME、TABLE_NAME)设置应用作输出表的表。仅支持单个输出表。表类型必须与 SQLSCRIPT_LOGGING_TABLE_TYPE 匹配。这是必需的配置设置 

过滤器

您可以使用过滤器关注特定消息。如果存在多个过滤器值,则应用 OR 运算符:

call SET_FILTER('conf1', 'topic', 'sqlscript', 'compiler')

将被评估为

topic==‘sqlscript’ || topic == ‘compiler’

备注当前仅支持 'topic' 类型。 过程描述SET_FILTER (CONFIGURATION_NAME, TYPE, ...)设置用于日志记录的过滤器。支持对多个过滤器值使用开放式参数。ADD_FILTER (CONFIGURATION_NAME, TYPE, ...)将过滤器值添加到过滤器类型REMOVE_FILTER (CONFIGURATION_NAME, TYPE, ...)从过滤器类型中移除过滤器值UNSET_FILTER (CONFIGURATION_NAME, TYPE)将过滤器值重置为缺省值(无过滤器) 

启动和停止日志记录

SQLSCRIPT_LOGGING 要求在调用对象之前显式启动日志记录。最外层语句执行完成后,日志记录将隐式停止,但也可以显式停止。

过程描述START_LOGGING (CONFIGURATION_NAME)开始收集给定配置的日志。如果未设置输出表或级别,则抛出错误。STOP_LOGGING (CONFIGURATION_NAME)停止收集给定配置的日志。 

配置步骤

  1. 使用 SYS.SQLSCRIPT_LOGGING_TABLE_TYPE 为记录创建日志表。

  1. 使用以下内容创建过程或调用匿名块:定义一个或多个配置设置。设置日志记录级别和在步骤 1 中创建的输出表。将一个或多个 SQLScript 对象(过程、函数、库)添加到配置中。(可选)使用过滤器类型和值设置过滤器。开始记录。调用在步骤 C 添加到配置的 SQLScript 对象。(可选)停止记录。

  1. 定义一个或多个配置设置。

  1. 设置日志记录级别和在步骤 1 中创建的输出表。

  1. 将一个或多个 SQLScript 对象(过程、函数、库)添加到配置中。

  1. (可选)使用过滤器类型和值设置过滤器。

  1. 开始记录。

  1. 调用在步骤 C 添加到配置的 SQLScript 对象。

  1. (可选)停止记录。

  1. 调用在步骤 2 中创建的过程。

    示例

    示例代码create function tudf1() returns table(a int) as begin using SQLSCRIPT_LOGGING as LIB; call LIB:LOG('debug', 'all', 'start tudf1'); s = select 1 as a from dummy; call LIB:LOG('debug', 'all', 'this is tudf1'); call LIB:LOG('debug', 'all', 'end tudf1'); return :s;end; create function tudf2() returns table(a int) as begin using SQLSCRIPT_LOGGING as LIB; begin sequential execution call LIB:LOG('debug', 'all', 'start tudf2'); call LIB:LOG('debug', 'all', 'tudf2 calls tudf1'); s = select * from tudf1(); call LIB:LOG('debug', 'all', 'end tudf2'); end; return :s;end; create table t1 like sys.sqlscript_logging_table_type;create table t2 like sys.sqlscript_logging_table_type;create table t_all like sys.sqlscript_logging_table_type; DO BEGIN using SQLSCRIPT_LOGGING as LIB; -- conf1 call LIB:CREATE_CONFIGURATION('conf1'); call LIB:ADD_SQLSCRIPT_OBJECT('conf1', current_schema, 'TUDF1'); call LIB:SET_OUTPUT_TABLE('conf1', current_schema, 'T1'); call LIB:SET_LEVEL('conf1', 'debug'); call LIB:START_LOGGING('conf1'); -- conf2 call LIB:CREATE_CONFIGURATION('conf2'); call LIB:ADD_SQLSCRIPT_OBJECT('conf2', current_schema, 'TUDF2'); call LIB:SET_OUTPUT_TABLE('conf2', current_schema, 'T2'); call LIB:SET_LEVEL('conf2', 'debug'); call LIB:START_LOGGING('conf2'); -- all call LIB:CREATE_CONFIGURATION('conf_all'); call LIB:ADD_SQLSCRIPT_OBJECT('conf_all', current_schema, 'TUDF1'); call LIB:ADD_SQLSCRIPT_OBJECT('conf_all', current_schema, 'TUDF2'); call LIB:SET_OUTPUT_TABLE('conf_all', current_schema, 'T_ALL'); call LIB:SET_LEVEL('conf_all', 'debug'); call LIB:START_LOGGING('conf_all'); select * from tudf2(); END; create user sqlscript_logging_user_a password Dummy1234 NO FORCE_FIRST_PASSWORD_CHANGE; connect sqlscript_logging_user_a password Dummy1234;create procedure p1 sql security invoker as begin using SQLSCRIPT_LOGGING as LIB; call LIB:LOG('error', 'sqlscript', 'hello world');end; grant execute, sqlscript logging on p1 to SYSTEM; connect SYSTEM password manager; DO BEGIN using SQLSCRIPT_LOGGING as LIB; call LIB:CREATE_CONFIGURATION('conf1'); call LIB:SET_OUTPUT_TABLE('conf1', current_schema, 'T1'); call LIB:SET_LEVEL('conf1', 'debug'); call LIB:ADD_SQLSCRIPT_OBJECT('conf1', 'SQLSCRIPT_LOGGING_USER_A', 'P1'); call LIB:START_LOGGING('conf1'); call SQLSCRIPT_LOGGING_USER_A.p1; call LIB:STOP_LOGGING('conf1');END;