存储过程给指定表绑定触发器sql里拼json作存储日志

项目给出了一个新的需求,利用触发器生成日志表,监听对数据库中关键表的增删改操作。将操作的数据拼成json格式作为一个clob存入oracle。

 1 create or replace procedure Logging_Messages(tableName varchar2 default ‘%‘) is
 2   cursor c_cl IS
 3     SELECT column_name tcl
 4       FROM user_tab_columns
 5      WHERE table_name = upper(tableName);
 6   newjson  clob;
 7   oldjson clob;
 8   v_sql varchar2(32000);
 9   V_TMP varchar2(32000);
10 begin
11   FOR cl IN c_cl LOOP
12     if newjson is null then
13       newjson := ‘{"‘ || cl.tcl || ‘":"‘‘||‘||‘:NEW.‘ || cl.tcl ||‘||‘‘"}‘;
14     else
15       newjson := newjson || ‘,‘ || ‘{"‘ || cl.tcl || ‘":"‘‘||‘||‘:NEW.‘ || cl.tcl ||‘||‘‘"}‘;
16     end if;
17     if oldjson is null then
18       oldjson := ‘{"‘ || cl.tcl || ‘":"‘‘||‘||‘:OLD.‘ || cl.tcl ||‘||‘‘"}‘;
19     else
20       oldjson := oldjson || ‘,‘ || ‘{"‘ || cl.tcl || ‘":"‘‘||‘||‘:OLD.‘ || cl.tcl ||‘||‘‘"}‘;
21     end if;
22   end LOOP;
23   DBMS_OUTPUT.put_line(‘newjson:‘||newjson);
24   DBMS_OUTPUT.put_line(‘oldjson:‘||oldjson);
25   V_TMP := Q‘{CREATE OR REPLACE TRIGGER [email protected][email protected]
26     BEFORE INSERT OR UPDATE OR DELETE ON  @[email protected] FOR EACH ROW
27     DECLARE
28     json  clob;
29     BEGIN
30       IF INSERTING THEN
31       json := ‘@newjson@‘;
32       DBMS_OUTPUT.put_line(‘json字符串是insert:‘||json);
33       insert into ddllog values(‘@TABLE_NAME@‘,‘insert‘,json,sysdate);
34     end if;
35
36     IF DELETING THEN
37       json := ‘@oldjson@‘;
38       DBMS_OUTPUT.put_line(‘json字符串是delete:‘||json);
39       insert into ddllog values(‘@TABLE_NAME@‘,‘delete‘,json,sysdate);
40     end if;
41
42     IF UPDATING THEN
43       json := ‘@newjson@‘;
44       DBMS_OUTPUT.put_line(‘json字符串是update:‘||json);
45       insert into ddllog values(‘@TABLE_NAME@‘,‘update‘,json,sysdate);
46     end if;
47
48     END [email protected][email protected];}‘;
49   V_TMP := REPLACE(V_TMP, ‘@[email protected]‘, tableName);
50   V_TMP := REPLACE(V_TMP, ‘@[email protected]‘, newjson);
51   V_SQL := REPLACE(V_TMP, ‘@[email protected]‘, oldjson);
52   DBMS_OUTPUT.put_line(V_SQL);
53   EXECUTE IMMEDIATE V_SQL;
54 end Logging_Messages;

为指定表建立监听的触发器,结果如下:

实现了预想的功能,感觉还有很大的完善空间。不过限于水平较低,慢慢来改吧。

时间: 2024-10-13 23:57:27

存储过程给指定表绑定触发器sql里拼json作存储日志的相关文章

Bat脚本备份sqlserver 表结构、存储过程、函数、指定表数据

Bat脚本备份sqlserver 表结构.存储过程.指定表数据: @echo off cd /d %~dp0 ::备份表结构.存储过程和部分配置表的数据 set LogFile=report.log set servername="192.168.43.9" set DBname="TEST" set User="sa" set Password="123456*" echo Deployed Time: %date% %ti

Sql语句不能识别Go的解决办法(动态创建表的触发器)

问题来源 用sqlserver直接打开sql文本,执行没问题,但是当用Sqlcommand类执行cmdtext命令文本时总是失败报错. 原因分析及解决 用数据库直接执行sql语句没问题,甚至还可以用Go来进行分批处理,但是当你用链接类访问数据库,并执行sql语句时就有些限制,如下: System.Data.SqlClient.SqlCommand cmd; try { using (System.Data.SqlClient.SqlConnection newconn = new System.

删除指定表的所有索引,包括主键索引,唯一索引和普通索引 ,适用于sql server 2005,

原文:删除指定表的所有索引,包括主键索引,唯一索引和普通索引 ,适用于sql server 2005, --删除指定表中所有索引 --用法:declare @tableName varchar(100) --set @tableName='表名' --表名 ,根据实际情况替换 --exec sp_dropindex @tableName if exists(select 1 from sysobjects where id = object_id('dropindex') and xtype =

利用Sql实现将指定表数据导入到另一个数据库示例

因为工作中经常需要将数据从一个数据库导入到另一个数据库中,所以将这个功能写成一个存储过程,以方便调用.现在粘贴出来供大家参考: 注意:1,以下示例中用到了syscolumns,sysobjects等系统视图,在sql2005及以后的版本中,大家也可以使用sys.columns与sys.objects来代替,只要修改对应的字段即可.2,以下示例还用到了set identity_insert设置,有对该设置不太清楚的朋友可以点击链接查看其用法.3,结合sys.tables表与游标,大家可以循环调用以

SQL 单表分页存储过程和单表多字段排序和任意字段分页存储过程

  第一种:单表多字段排序分页存储过程       --支持单表多字段查询,多字段排序 create PROCEDURE [dbo].[UP_GetByPageFiledOrder] ( @TableName varchar(50), --表名 @ReFieldsStr varchar(200) = '*', --字段名(全部字段为*) @OrderString varchar(200), --排序字段(必须!支持多字段不用加order by) @WhereString varchar(500)

将IP表存入SQL里的程序

这个资料是以前收集的,希望能对你有所帮助. 1.page1.htm <html> <head> </head> <body> <form id=scr_Data> First Name: <input type=text id=s_FName value="none"> <br> Last Name: <input type=text id=s_LName value="none&quo

用SQL profiler工具抓指定表名的动态

note: 网上很少有人提到,我也记下. 用SQL profiler工具抓指定表名(单个表)的动态 1,选择textdata字段 2,筛选databasename. 3,筛选表名,注意前后%%号. 原文出处:http://blog.51cto.com/aizzw/803462 原文地址:https://www.cnblogs.com/HaiHong/p/9625514.html

使用sql查询mysql/oracle/sql server/gp数据库中指定表的字段信息(字段名/字段类型/字段长度/是否是主键/是否为空)

1,根据数据库类型拼接不同URL /** * 根据类型不同拼接连接的URL * @param dbType 1:mysql.2:oracle.3:sql server.4:gp * @param ip * @param port * @param databaseName * @return*/ public static String getTestDbUrl(int dbType, String ip, String port, String databaseName){ String ur

SQL存储过程直接传表

将数据表传递给SQL Server中的存储过程 创建一个表: 1 CREATE TABLE dbo.TestTableVariable 2 ( 3 ID INT IDENTITY(1,1) primary key, 4 Name VARCHAR(10), 5 Addr VARCHAR(10) 6 ) 创建需要传的表: 1 CREATE TYPE dbo.TableVariable AS TABLE 2 ( 3 ID INT 4 ) 插入一些默认数据: 1 INSERT INTO dbo.Test