我们可以在数据库中记录对象的更改吗?例如,我改变了一些程序。我想记录旧代码和新代码

Can we log changing of object in database. For example I change something in procedure. And I want to log old code and new code

使用触发器更改日志。我知道触发器中的旧的和新的,在那里你可以找到旧的 DML 行和新的。但是我不知道如何记录对象中的用户更改。

I don't know how to log what user changes in object.

你说的。 returns 当前会话用户userfunction

SQL> connect scott/tiger
Connected.
SQL>
SQL> select user from dual;

USER
------------------------------
SCOTT

SQL>

因此,只需将 user 添加到您的触发器中即可。


根据您发表的评论,您似乎在寻找修改程序代码的用户(而不是通过程序修改数据的用户)。

在那种情况下,它就是过程的所有者(除非其他人已被授予 ALTER ANY PROCEDURE 系统权限)。

如果很多人登录到该模式并可以修改过程的代码,那么:考虑这是否是对数据库的正确方法。应该有一个开发数据库,​​启用版本控制(例如,考虑 Git 或 Subversion),然后收集有关代码更改内容、更改人员和更改时间的数据。

从生产数据库开始:不应允许开发人员访问它。让 DBA 将更改应用于对象。


如果查询user_objects,有最后一次DDL时间的信息

SQL> create or replace procedure p_test is
  2  begin
  3    null;
  4  end;
  5  /

Procedure created.

SQL> select created, last_ddl_time from user_objects where object_name = 'P_TEST';

CREATED             LAST_DDL_TIME
------------------- -------------------
03.10.2021 20:59:53 03.10.2021 20:59:53

SQL> alter procedure p_test compile;

Procedure altered.

SQL> select created, last_ddl_time from user_objects where object_name = 'P_TEST';

CREATED             LAST_DDL_TIME
------------------- -------------------
03.10.2021 20:59:53 03.10.2021 21:00:08

SQL>

另外:如果您使用 flashback,您可以看到该过程之前的样子,但我不确定您是否可以将它用于日志目的。

SQL> connect scott/tiger
Connected.
SQL> create or replace procedure p_test is
  2  begin
  3    dbms_output.put_line('Hello');
  4  end;
  5  /

Procedure created.

SQL> connect sys as sysdba
Enter password:
Connected.
SQL> select text from dba_source
  2  as of timestamp systimestamp - interval '5' minute
  3  where owner = 'SCOTT'
  4    and name = 'P_TEST';

TEXT
--------------------------------------------------------------------------------
procedure p_test is
begin
  null;
end;

SQL>

我不知道要在 Oracle 中跟踪旧代码。您需要使用 Git 等外部工具来正确应用版本控制并对您的代码进行编目。如果您想跟踪谁更改了数据库中的代码,那么use auditing;这是跟踪 DDL 更改的首选方法。使用 USER_OBJECTS 只会显示 最新的 变化,而不是完整的历史记录,因此很容易遗漏。闪回通常有一个非常有限的时间跨度让你回顾,所以这也不适合你的目的。

审计可以捕获大部分(如果不是全部)会话参数,包括客户端 OS 用户、数据库代理用户和其他用户,这样即使正在使用公共数据库 account/schema,您也可以识别真实用户被多个开发者使用。

正如其他人所回答的那样 - oracle 中的内部编译代码没有版本控制。代码的版本控制是您需要在开发团队中实施的事情。您可以遵循一些最佳实践

  • 在处理代码时,从源代码控制中获取最新版本 - 这应该是真实的来源。如果有人尚未签到 - 那么 his/her 代码将丢失。
  • 每当更改代码时,开发人员都会立即签入他的代码。签入是代码已更改的指示器。
  • 在代码中使用注释来指明更改者。在我们的代码中,我们在包规范中有一个注释部分,每次更改一行。
  • 您还应该考虑使用 liquibase 之类的工具来跟踪对象的变化