我们可以在数据库中记录对象的更改吗?例如,我改变了一些程序。我想记录旧代码和新代码
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 当前会话用户是user
,function。
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 之类的工具来跟踪对象的变化
使用触发器更改日志。我知道触发器中的旧的和新的,在那里你可以找到旧的 DML 行和新的。但是我不知道如何记录对象中的用户更改。
I don't know how to log what user changes in object.
你说的。 returns 当前会话用户是user
,function。
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 之类的工具来跟踪对象的变化