【database】审计/记录mysql、postgres、sqlserver、oracle数据库的ddl事件和语句

一、mysql

很遗憾,mysql不支持database级别的trigger。无法使用触发器记录ddl。
如果需要获取dll记录可以使用debezium/cdc在mysql的binlog中解析。

二、postgres

创建trigger

能记录:

  • create table
  • drop table
  • alter table add/drop/rename/修改类型

不能记录

  • truncate

参考文章

-- 参考文章:https://blog.csdn.net/weixin_42212488/article/details/127873487
-- 官方文档:https://www.postgresql.org/docs/13/functions-event-triggers.html#PG-EVENT-TRIGGER-TABLE-REWRITE-FUNCTIONS
drop table ddl_log;
create table ddl_log(id serial8,"user" text,txid bigint,schema_name text,ddl_type text,object varchar,ddl_query text,query_time timestamp);truncate audit_ddl;
select * from audit_ddl;drop function ddl_listen_common();
create or replace function ddl_listen_common()
returns event_trigger
language plpgsql
as
$$declarequery text;command record;beginquery := current_query();if exists(select * from pg_event_trigger_ddl_commands()) thenfor command in select * from pg_event_trigger_ddl_commands()loopinsert into audit_ddl("user", txid, schema_name, ddl_type, object, ddl_query, query_time)VALUES (current_user,txid_current(),command.schema_name,command.command_tag,command.object_identity,query, statement_timestamp());end loop ;end if;end;
$$
security definer;drop event trigger trg_ddl_listen_common;
create event trigger trg_ddl_listen_common on ddl_command_end execute procedure ddl_listen_common();drop function ddl_listen_drop;
create or replace function ddl_listen_drop()
returns event_trigger
language plpgsql
as
$$
declarequery text;command record;
beginquery := current_query();if exists(select * from pg_event_trigger_dropped_objects()) is not null thenfor command in select * from pg_event_trigger_dropped_objects()loopinsert into audit_ddl("user", txid, schema_name, ddl_type, object, ddl_query, query_time)VALUES (current_user,txid_current(),command.schema_name,'DROP '||command.object_type,command.object_identity,query, statement_timestamp());end loop;end if;
end;
$$
security definer;drop event trigger trg_ddl_listen_drop;
create event trigger trg_ddl_listen_drop on sql_drop  execute procedure ddl_listen_drop();

测试

drop table if exists ischema.schema_evo;
create table ischema.schema_evo(
id bigint primary key
,name varchar(30)
,address varchar(30)
);insert into ischema.schema_evo values(1,'zhangsna','beijing');alter table ischema.schema_evo add "gender" varchar(10);
insert into ischema.schema_evo values(2,'lisi','male','shanghai');
alter table ischema.schema_evo rename column "name" to name_abbr;
insert into ischema.schema_evo values(3,'lvzhou','male','shanghai');
alter table ischema.schema_evo alter column "name_abbr" type varchar(50);
insert into ischema.schema_evo values(4,'wangwu','female','chongqing');
alter table ischema.schema_evo drop column address;
insert into ischema.schema_evo values(5,'zhaoliu','male');
-- 不支持truncate记录。
truncate ischema.schema_evo;select * from ischema.schema_evo where 1=1 order by id desc limit 10;

三、sqlserver

创建trigger

能记录

  • create table
  • drop table
  • alter table add/drop/修改类型 column

不能记录

  • alter table rename column
  • truncate

参考文章


-- 参考文章:https://blog.csdn.net/qq_40205468/article/details/88845215drop table ischema.audit_ddl;
truncate ischema.audit_ddl;
select * from ischema.audit_ddl;drop trigger trg_ddl_listen ON DATABASE;
-- 以下均为触发器内容,一次执行即可。
CREATE TRIGGER trg_ddl_listenON DATABASEFOR CREATE_TABLE, DROP_TABLE, ALTER_TABLE
AS
/* 本触发器只针对触发器的增删改,进行记录触发器的相关信息 */
IF OBJECT_ID(N'ischema.audit_ddl', N'U') is NULL
begin
CREATE TABLE ischema.audit_ddl(rowid INT IDENTITY ,EventType VARCHAR(20) ,PostTime DATETIME ,SPID INT ,ServerName VARCHAR(255) ,LoginName VARCHAR(255) ,DatabaseName VARCHAR(255) ,UserName VARCHAR(255),SchemaName VARCHAR(20) ,ObjectName VARCHAR(255) ,ObjectType VARCHAR(20) ,CommandText NVARCHAR(MAX) ,remark NVARCHAR(MAX) ,commandtext_check INT);
endDECLARE
@EeventType VARCHAR(20),@PostTime DATETIME,@SPID INT,@ServerName VARCHAR(255),@LoginName VARCHAR(255),@DatabaseName VARCHAR(255),@UserName VARCHAR(255),@SchemaName VARCHAR(255),@ObjectName VARCHAR(255),@ObjectType VARCHAR(20),@CommandText NVARCHAR(MAX),@Remarks NVARCHAR(MAX),@Commandtest_check INTSET @EeventType=EVENTDATA().value('(/EVENT_INSTANCE/EventType)[1]','VARCHAR(20)')
SET @PostTime=EVENTDATA().value('(/EVENT_INSTANCE/PostTime)[1]','DATETIME')
SET @SPID=EVENTDATA().value('(/EVENT_INSTANCE/SPID)[1]','INT')
SET @ServerName=EVENTDATA().value('(/EVENT_INSTANCE/ServerName)[1]','VARCHAR(255)')
SET @LoginName=EVENTDATA().value('(/EVENT_INSTANCE/LoginName)[1]','VARCHAR(255)')
SET @DatabaseName=EVENTDATA().value('(/EVENT_INSTANCE/LoginName)[1]','VARCHAR(255)')
SET @UserName=EVENTDATA().value('(EVENT_INSTANCE/UserName)[1]','VARCHAR(255)')
SET @SchemaName=EVENTDATA().value('(EVENT_INSTANCE/SchemaName)[1]','VARCHAR(255)')
SET @ObjectName=EVENTDATA().value('(EVENT_INSTANCE/ObjectName)[1]','VARCHAR(255)')
SET @ObjectType=EVENTDATA().value('(EVENT_INSTANCE/ObjectType)[1]','VARCHAR(255)')
SET @CommandText=EVENTDATA().value('(EVENT_INSTANCE/TSQLCommand/CommandText)[1]','NVARCHAR(MAX)')INSERT  INTO ischema.audit_ddl( EventType ,PostTime ,SPID ,ServerName ,LoginName ,DatabaseName ,UserName ,SchemaName ,ObjectName ,ObjectType ,CommandText ,remark ,commandtext_check)
SELECT @EeventType,@PostTime,@SPID,@ServerName,@LoginName,@DatabaseName,@UserName,@SchemaName,@ObjectName,@ObjectType,@CommandText,'',0;

测试


drop table ischema.schema_evo;
create table ischema.schema_evo(
id bigint primary key
,name varchar(30)
,address varchar(30)
);
-- 启动表的CDC跟踪。
EXEC sys.sp_cdc_enable_table @source_schema = 'ischema', @source_name = 'schema_evo', @role_name = NULL, @supports_net_changes = 0;insert into ischema.schema_evo values(1,'test','xinjiang');alter table ischema.schema_evo add gender varchar(10);
insert into ischema.schema_evo values(2,'test','beijing','female');alter table ischema.schema_evo alter column "name" varchar(50);
insert into ischema.schema_evo values(3,'test','hangzhou','male');-- 已经启用cdc的表无法修改列名称:Cannot alter column 'name' because it is 'REPLICATED'.
exec sp_rename 'ischema.schema_evo.name','name_abbr';alter table ischema.schema_evo drop column address;
insert into ischema.schema_evo values(4,'test','female');-- 已经启用cdc的表无法truncate:Cannot truncate table 'ischema.schema_evo' because it is published for replication or enabled for Change Data Capture.
TRUNCATE table ischema.schema_evo;select * from ischema.schema_evo;-- 获取ddl, 可以通过 "ddl_command"列 获取到具体的ddl命令。
-- 参考:https://learn.microsoft.com/zh-cn/sql/relational-databases/system-stored-procedures/sys-sp-cdc-get-ddl-history-transact-sql?view=sql-server-ver16&redirectedfrom=MSDN
EXEC sys.sp_cdc_get_ddl_history  @capture_instance = 'ischema_schema_evo';

四、oracle

创建trigger

参考文章

能记录

  • create table
  • drop table
  • alter table add/drop/rename/修改类型 column
  • truncate

不能记录


-- 参考文章:https://blog.csdn.net/u014257861/article/details/80182067
-- DBA账号授权。
grant administer DATABASE TRIGGER to cdcuser;
SELECT * FROM USER_SYS_PRIVS;  -- 要有:ADMINISTER DATABASE TRIGGER 权限 DROP TABLE audit_ddl;
create table audit_ddl (
opertime timestamp PRIMARY KEY,
ip varchar2(20),
hostname varchar2(30),
operation varchar2(30),
object_type varchar2(30),
object_name varchar2(30),
sql_stmt clob,
db_schema varchar2(30)
);TRUNCATE TABLE audit_ddl;
SELECT * FROM audit_ddl;DROP TRIGGER trg_ddl_listen;create or replace trigger trg_ddl_listenafter ddl on database
DECLAREPRAGMA AUTONOMOUS_TRANSACTION;n        NUMBER;stmt     clob := NULL;sql_text ora_name_list_t;
BEGINn := ora_sql_txt(sql_text);FOR i IN 1 .. n LOOPstmt := stmt || sql_text(i);END LOOP;INSERT INTO audit_ddl(opertime, ip, hostname, operation, object_type, object_name, sql_stmt,db_schema)VALUES(systimestamp,sys_context('userenv', 'ip_address'),sys_context('userenv', 'HOST'),ora_sysevent,ora_dict_obj_type,ora_dict_obj_name,stmt,user);COMMIT;
END;

测试

drop table DBO.SCHEMA_EVO;
create table DBO.SCHEMA_EVO(
id numeric(10,0) primary key
,name varchar(30)
,address varchar(30)
);
INSERT INTO DBO.SCHEMA_EVO VALUES(1,'TEST','BEIJING');ALTER TABLE DBO.SCHEMA_EVO ADD gender varchar(10);
INSERT INTO DBO.SCHEMA_EVO VALUES(2,'TEST','SHANGHAI','FEMALE');
ALTER TABLE DBO.SCHEMA_EVO MODIFY name varchar(50) default 'abbr';
INSERT INTO DBO.SCHEMA_EVO VALUES(3,'TEST','SHANGHAI','MALE');
ALTER TABLE DBO.SCHEMA_EVO RENAME COLUMN name TO name_abbr;
INSERT INTO DBO.SCHEMA_EVO VALUES(4,'TEST','SUZHOU','FEMALE');
ALTER TABLE DBO.SCHEMA_EVO DROP COLUMN address;
INSERT INTO DBO.SCHEMA_EVO VALUES(5,'TEST','FEMALE');
-- 支持记录TRUNCATE操作.
TRUNCATE TABLE DBO.SCHEMA_EVO;SELECT * FROM DBO.SCHEMA_EVO;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/135880.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# PictureBox——SizeMode属性

Normal ——标准模式, 在此模式下, 图片位于PictureBox的左上角, 图片的大小由PictureBox控件的大小决定, 当图片的大小大于PictureBox的尺寸时, 多余的图像将被剪切掉StretchImage——PictureBox会根据自身的长宽比例. 来调整图片的长宽比例, 使图片在PictureBox中完整显示出来…

基于Fuzzing和ChatGPT结合的AI自动化测试实践分享

一、前言 有赞目前,结合insight接口自动化平台、horizons用例管理平台、引流回放平台、页面比对工具、数据工厂等,在研发全流程中,已经沉淀了对应的质量保障的实践经验,并在逐渐的进化中。 在AI能力大幅进步的背景下&#xff0c…

Maven 从入门到精通

目录 一. 前言 二. Maven 下载与安装 2.1. 下载 2.2. 安装 三. Maven 核心概念 3.1. POM 3.2. 约定的目录结构 3.3. 坐标 3.4. 依赖管理 3.4.1. 直接依赖和间接依赖 3.4.2. 依赖的排除 3.4.3. 统一的版本管理 3.4.4. 依赖范围 3.5. 仓库 3.6. 生命周期/插件/目标…

vue3怎么获取el-form的元素节点

在元素中使用ref设置名称 在ts中通过从element-plus引入formInstance,设置formRef同名名称字段来获取el-form节点

HackTheBox-Starting Point--Tier 1---Funnel

文章目录 一 题目二 实验过程三 利用SSH隧道3.1 本地端口转发 一 题目 Tags FTP、PostgreSQL、Reconnaissance、Tunneling、Password Spraying、Port Forwarding、Anonymous/Guest Access、Clear Text Credentials译文:FTP、PostgreSQL、侦察、隧道技术、密码喷洒…

WordPress相关文章推荐

首先 WordPress 本身并没有相关文章的推荐功能,网站之所以需要这样的功能出于两个原因,一方面是推荐相关的内容越优质,访客的留存和继续阅读将会增强,同样从优化角度来说会更加有利于搜索引擎抓取时对页面质量的提升,毕…

AD9371 官方例程 NO-OS 主函数 headless 梳理(一)

AD9371 系列快速入口 AD9371ZCU102 移植到 ZCU106 : AD9371 官方例程构建及单音信号收发 ad9371_tx_jesd -->util_ad9371_xcvr接口映射: AD9371 官方例程之 tx_jesd 与 xcvr接口映射 AD9371 官方例程 时钟间的关系与生成 : AD9371 官方…

RPA处理重复工作,助力高效资金管理

在瞬息万变的市场竞争中,众多企业开展多元化经营以获取最大的经济效益。然而,企业的多元化经营程度越高,协调活动可能造成的决策延误也越多,其资金管理往往将面临更大的考验。随着新技术的发展,更多具备多元产业的企业…

【蓝桥杯选拔赛真题15】C++三个数排序 第十二届青少年组蓝桥杯C++选拔赛真题解析

目录 C/C++排序 一、题目要求 1、编程实现 2、输入输出 二、算法分析

【Redis】Redis与SSM整合Redis注解式缓存Redis解决缓存问题

一&#xff0c;Redis与ssm整合 1.1 pom.xml配置 在pom.xml中配置相关的redis文件 redis文件&#xff1a; <redis.version>2.9.0</redis.version> <redis.spring.version>1.7.1.RELEASE</redis.spring.version><dependency><groupId>red…

DAIR-V2X-V 3D检测数据集 转为Kitti格式 | 可视化

本文分享在DAIR-V2X-V数据集中&#xff0c;将标签转为Kitti格式&#xff0c;并可视化3D检测效果。 一、将标签转为Kitti格式 DAIR-V2X包括不同类型的数据集&#xff1a; DAIR-V2X-IDAIR-V2X-VDAIR-V2X-CV2X-Seq-SPDV2X-Seq-TFDDAIR-V2X-C-Example: google_drive_linkV2X-Seq-…

K8s之CRD

一、CRD概述 Kubernetes中将一切都视为资源&#xff0c;资源是Kubernetes API中的一个Endpoint&#xff0c;存储了某种类型的API对象&#xff0c;例如Pod、Deployment、Configmap、Volume等都是一种资源&#xff0c;不过这些都属于内置资源&#xff0c;是Kubernetes默认提供的…

SpringBoot Kafka生产者 多kafka配置

一、配置文件 xxxxxx:kafka:bootstrap-servers: xx.xx.xx.xx:9092,xx.xx.xx.xx:9092producer: # 设置大于0的值&#xff0c;则客户端会将发送失败的记录重新发送retries: 3 #当有多个消息需要被发送到同一个分区时&#xff0c;生产者会把它们放在同一个批次里。该参数指定了一…

如何成为优秀的产品经理?新人必看!

从一名普通产品经理到一名优秀的产品经理要经历多少步&#xff1f;哪些能力是稀缺的能力&#xff1f;哪些能力又是公司急需的能力&#xff1f;善于推动项目研发重要&#xff0c;还是搞定业务更重要&#xff1f; 这些关于优秀产品经理的能力&#xff0c;本文将全面讨论&#xf…

10-27 maven概念

maven maven的概念模型: 项目对象模型(POM: Project object Model)&#xff0c;一组标准集合: pom.xml 依赖管理系统(Dependency Management System) 项目生命周期(Project Lifecycle) 项目对象模型&#xff1a; 把项目当成一个对象&#xff0c;描述这个项目&#xff0c;使用p…

sql注入学习笔记

sql注入原理 掌握sql注入漏洞的原理掌握sql注入漏洞的分类 万能用户名 777 or 11 #原句 select userid from cms_users where username ".$username." and password".md5 ( $password ) ."输入过后为 select userid from cms_users where username …

Nginx网关配置

安装Nginx 下载最新版本Nginx nginx: download 解压 双击nginx.exe启动 浏览器访问 localhost 看到如下界面 微服务准备 准备两个服务&#xff0c;例如&#xff1a;product微服务和order微服务 分别启动后&#xff0c;访问相应服务接口 product服务 http://localhost:9001/…

【Codeforces】Codeforces Round 905 (Div. 3)

Problem - 1883C - Codeforces 这题当时想复杂了。 题目大意&#xff1a; 给一串数组和一个数字k&#xff0c;求对数组进行多少次操作能是他们的乘积是k的倍数。 操作是选定一个数加上1。 这题需要抓住一个点k属于[2,5]&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5中…

将对象与返回的数据所对应的键相同时一一赋值

问题描述 对象与返回的数据直接赋值&#xff0c;会将多余的键与值也添加上 那么赋值时值要 目标对象的键所对应的值 解决方案&#xff1a; 利用双重遍历 来比对 当 键相同时再赋值 duiYingFuZhi(obj,data){for (let key in obj) {for (let index in data) {if (keyindex) {obj…

开发知识点-Pygame

Pygame Pygame最小开发框架与最小游戏游戏开发入门单元开篇 Pygame简介安装游戏开发入门语言开发工具的选择 Pygame最小开发框架与最小游戏 游戏开发入门单元开篇 Pygame简介安装 游戏开发入门语言开发工具的选择