前几天遇到了一个奇怪的bug,有一条数据莫名其妙被删除了。而这条数据也不是每次都被删除,只是偶尔被删除。删除这条数据的函数在两个地方调用:1. 在主线程中,用户请求,将被删除。2. 在一个守护线程中,每隔一定的时间运行删除。由于是多台server同时运行,前面有台Load balance进行负载均衡。这样我们没有办法确定是哪台server删除了这条数据,而且也有可能是开发者直接用本地的环境连到db删除了这条数据。为了确认是哪台server删除这条数据,于是我们增加了一个触发器对这个表进行了监控:
1. 创建一个记录请求的表
create table aduitclock(
terminal varchar2(250),
sessionid varchar2(250),
instance varchar2(250),
current_user varchar2(250),
current_userid varchar2(250),
session_user varchar2(250),
session_userid varchar2(250),
proxy_user varchar2(250),
proxy_userid varchar2(250),
db_domain varchar2(250),
db_name varchar2(250),
host varchar2(250),
os_user varchar2(250),
external_name varchar2(250),
ip_address varchar2(250),
INSERTTIME varchar2(250),
LOCK_PATH varchar2(4000)
)
2. 增加触发器对表进行监控
CREATE OR REPLACE TRIGGER locks_aduitdel
before delete on wbxcore_locks
for each row
begin
insert into aduitclock select
SYS_CONTEXT('USERENV','TERMINAL') terminal,
SYS_CONTEXT('USERENV','SESSIONID') sessionid,
SYS_CONTEXT('USERENV','INSTANCE') instance,
SYS_CONTEXT('USERENV','CURRENT_USER') current_user,
SYS_CONTEXT('USERENV','CURRENT_USERID') current_userid,
SYS_CONTEXT('USERENV','SESSION_USER') session_user,
SYS_CONTEXT('USERENV','SESSION_USERID') session_userid,
SYS_CONTEXT('USERENV','PROXY_USER') proxy_user,
SYS_CONTEXT('USERENV','PROXY_USERID') proxy_userid,
SYS_CONTEXT('USERENV','DB_DOMAIN') db_domain,
SYS_CONTEXT('USERENV','DB_NAME') db_name,
SYS_CONTEXT('USERENV','HOST') host,
SYS_CONTEXT('USERENV','OS_USER') os_user,
SYS_CONTEXT('USERENV','EXTERNAL_NAME') external_name,
SYS_CONTEXT('USERENV','IP_ADDRESS') ip_address,
sysdate,
:old.lock_path
FROM DUAL;
这样我们就很容易从表
aduitclock中,根据ip_address 和LOCK_PATH查出是哪个server删除了这条数据了。
分享到:
相关推荐
触发器是一组预先定义的SQL语句,它们会在特定的事件(如数据插入、更新或删除)发生时自动执行。这些事件称为触发事件。在DB2中,可以在单个表或视图上定义多个触发器,每个触发器都有其特定的激活顺序,基于创建时...
当表的数据量较大时,使用 DELETE 语句可能会较慢,因为每次删除都需要记录回滚信息。这时,TRUNCATE 语句通常更高效,它会移除表中的所有数据但不保留回滚信息。因此,如果你收到“数据库的事务日志已满”的错误...
在数据库管理领域,触发器是一种特殊类型的存储过程,它被设计为当特定事件(如数据插入、更新或删除)发生时自动执行。触发器能够帮助维护数据的一致性和完整性,确保业务逻辑的正确执行。本文将深入探讨如何使用...
触发器可以在数据库中对某些事件发生时自动执行,例如创建数据库对象或在数据表中插入记录、修改记录或者删除记录时。触发器可以确保数据的处理必须符合由某些 SQL 语句所定义的规则。 触发器的功能 触发器可以...
例如,如果需要将数据从一个名为TEST1的表导入到另一个名为TEST2的表,可以选择INSERT方式进行导入,这样TEST2中的数据将被TEST1的数据追加。若希望替换TEST2中的数据,可以使用REPLACE或REPLACE_CREATE模式。 总结...
1. **SQL基本语法**:包括SELECT语句用于查询数据,INSERT用于插入新记录,UPDATE用于修改现有记录,DELETE用于删除记录。了解这些基本语句的结构和用法是SQL学习的基础。 2. **数据类型**:DB2支持多种数据类型,...
- 在`触发器.txt`文件中,可能包含了一些具体的触发器应用实例,比如创建一个在用户尝试删除重要记录时记录日志并阻止删除的触发器,或者在插入新数据时检查其符合业务规则的触发器。 综上所述,理解并巧妙地运用...
【数据库完整性实验】实验完整代码 ...(10)建立一个触发器course_check,每当删除课程表中记录时,先检查此课程是否已被选修,如选修则不允许删除,且给出提示信息“此课程已有学生选修,无法删除!”。
3.在你的案例场景中,分别设计并实现一个由数据插入、数据更新、数据删除所引发的触发器(前触发或后触发都可以),测试触发器执行效果。 二、索引实验 1) 结合作业#3,针对你的数据库中的一个表,编写简单的数据...
1. **SQL基础知识**:解释SQL的基本语法,如SELECT语句用于查询数据,INSERT用于添加新记录,UPDATE用于修改已有记录,DELETE用于删除记录。 2. **DB2 SQL扩展**:DB2作为IBM的产品,可能提供了一些特有的SQL扩展,...
- `ora_is_drop_column`:判断是否有列被删除。 - `ora_login_user`:获取登录用户的名称。 - `ora_sysevent`:获取系统事件的名称。 - `is_servererror`:判断系统是否产生了指定的错误。 例如,可以通过`ora_...
此外,触发器还可以用于审计目的,记录对数据的更改历史。 综上所述,DB2作为一款强大的数据库管理系统,提供了丰富的数据类型和约束条件,支持创建复杂的数据结构,如表、视图和索引。理解并熟练掌握这些概念对于...
在IBM DB2中,SQL是进行数据查询、更新、插入和删除等操作的主要工具。 1. SQL基础: - SELECT语句:用于从数据库中检索数据,可以指定字段、表、条件等。 - INSERT语句:向数据库表中添加新记录。 - UPDATE语句...
9. **db2 delete from table_name where condition**:根据条件删除表中的记录。 10. **db2 update table_name set column = new_value where condition**:根据条件更新表中的记录。 11. **db2 backup database ...
在IT领域,数据库管理系统(Database Management System,简称DBMS)是至关重要的组成部分,DB2作为IBM公司开发的关系型数据库管理系统,被广泛应用于企业级的数据存储和管理。DB2+700认证是对个人DB2技能的专业认可...
触发器是一种在数据库中定义的操作(如插入、更新或删除)发生时自动执行的程序,它们可以在源表上监控数据变化并记录到增量日志表,以便后续的ETL(提取、转换、加载)过程使用。 数据加载的方法多样,例如全表...
7. **建立触发器**:`CREATE TRIGGER`定义在特定事件(如删除)发生时执行的代码,示例中创建了一个在`zjt_tables`上删除后触发的触发器,将旧记录插入到另一个表`zjt_tables1`。 8. **建立唯一性索引**:`CREATE ...
数据操作则涵盖了数据的插入、更新、删除和查询,如INSERT, UPDATE, DELETE, SELECT等;数据控制命令用于管理权限、备份和恢复,例如GRANT和BACKUP等;最后,SQL查询语句是数据处理的核心,包括基本查询、联接查询、...
用户可以通过SQLiteSpy执行SQL查询、查看数据表、编辑记录、创建新表、索引和触发器,甚至进行数据库备份和恢复。在提供的压缩文件中,SQLiteSpy.exe就是这个工具的可执行文件。 3. **SQLite数据库操作** - **查询...
- SQL脚本可用于创建表、插入数据、更新数据、删除数据、创建视图、触发器和存储过程等数据库操作。 6. **数据库备份与恢复** - DB2提供强大的备份和恢复机制。使用`db2 backup database mydb to /backup/`命令...