Sql Oracle列是否有自动修改时间戳类型?

Sql Oracle列是否有自动修改时间戳类型?,sql,oracle,Sql,Oracle,有没有办法在Oracle中创建一个timestamp列,自动存储记录更改时的时间戳 非常确定,您必须在Oracle中使用触发器执行此操作: create or replace TRIGGER parkedorder_tbiur BEFORE INSERT OR UPDATE ON parkedorder REFERENCING OLD AS old_row NEW AS new_row FOR EACH ROW BEGIN IF INSERTING THEN

有没有办法在Oracle中创建一个timestamp列,自动存储记录更改时的时间戳

非常确定,您必须在Oracle中使用触发器执行此操作:

create or replace TRIGGER parkedorder_tbiur
   BEFORE INSERT OR UPDATE
   ON parkedorder
   REFERENCING OLD AS old_row NEW AS new_row
   FOR EACH ROW
BEGIN
   IF INSERTING
   THEN
      IF :new_row.ID IS NULL
      THEN
         SELECT parkedorder_seq.NEXTVAL
           INTO :new_row.ID
           FROM DUAL;
      END IF;
   END IF;

   IF    :new_row.lastupdated <> SYSDATE
      OR :new_row.lastupdated IS NULL
   THEN
      SELECT sysdate
        INTO :new_row.lastupdated
        FROM DUAL;
   END IF;

   SELECT SYS_CONTEXT ( 'USERENV', 'OS_USER' )
     INTO :new_row.lastupdatedby
     FROM DUAL;
END;

对于oracle,我通常使用触发器来更新时间戳字段

CREATE OR REPLACE TRIGGER update_timestamp 
  BEFORE INSERT OR UPDATE ON some_table
  FOR EACH ROW
BEGIN
  :NEW.TS := systimestamp;
END;
与MySQL等其他DBs不同,Oracle似乎没有用于将时间戳字段更新为当前时间戳的内置属性

是,通过触发器:

create or replace
TRIGGER schema.name_of_trigger
BEFORE INSERT OR UPDATE ON schema.name_of_table
FOR EACH ROW
BEGIN
    :new.modified_on := SYSTIMESTAMP;
END;
这假设您的表有一个名为modified_on的字段


如上所述,触发器是一个理想的候选对象,只要您有多个不同的位置更新表。如果只有一个函数/过程可以更新表,只需在那里执行,并跳过触发器。

我建模的表始终包括:

已创建\u用户,VARCHAR2 创建日期 更新的用户,VARCHAR2 更新日期 …列。如果可以在插入/更新的同时设置值,为什么要实现触发器

INSERT INTO TABLE (...CREATED_DATE, UPDATED_DATE) VALUES (...,SYSDATE, SYSDATE);

UPDATE TABLE
   SET ...,
       UPDATED_DATE = SYSDATE

您可以通过查询ORA_ROWSCN非常接近这一点:

如果使用ROWDEPENDENCIES选项创建表,则更准确

它实际上记录了记录的提交时间

drop table tester 
/

create table tester (col1 number, col2 timestamp)
rowdependencies
/

insert into tester values (1, systimestamp)
/

(approximate five second pause)

commit
/

select t.ora_rowscn,
       SCN_TO_TIMESTAMP(t.ora_rowscn),
       t.col1,
       t.col2
from   tester t
/

ORA_ROWSCN             SCN_TO_TIMESTAMP(T.ORA_ROWSCN) COL1                   COL2
---------------------- ------------------------------ ---------------------- -------------------------
9104916600628          2009-10-26 09.26.38.000000000  1                      2009-10-26 09.26.35.109848000 

另一种处理方法是启用细粒度审计。单独的行没有时间戳,但您将拥有所有更改的记录。不过,在大多数情况下,杀伤力过大——我通常只使用触发器


如果您对最接近的0.01秒表示满意,则可以使用日期格式并分配sysdate。如果需要更多详细信息,请使用时间戳

聪明的扳机。为了启迪子孙后代,这似乎要做三件事。它将主键设置为顺序ID,将上次更新的时间设置为当前时间,并将上次更新的时间设置为我以前从未见过的神秘事物,但我推测它不知怎么会得到一个用户名+1是,它将lastupdatedby列设置为客户端上用于启动更新的凭据的用户名;此应用程序的哪个用户是客户端上的交互式用户。如果需要,则不需要第二个用户。您正在插入,因此只需设置lastupdated值。如果允许执行插入操作的用户覆盖lastupdated字段,则系统日期极易发生localtime与servertime错误。最好是无条件地强制执行lastupdated值。此外,您还可以将该sql语句与最后一条sql语句结合使用,以减少触发器中的语句数。这是一个很好的方法:需要一些小的编辑,但非常巧妙。。。因为这很容易忘记,有了扳机,你就不会忘记。归根结底是环境问题。如果您从不更改访问数据的SQL,那么触发器就是一种浪费。但在大多数情况下,有一个触发器比总是记住设置要容易得多it@David:我只允许一个存储过程更新给定的表,然后根据需要引用存储过程。触发器更容易丢失,因为它们在查看存储过程时不可见。如果用户具有直接访问权限,则会出现更大的问题。@David:创建的触发器和时间很容易记住:使用NOTNULL约束。一旦数据库处于野生状态,则控制更少Oracle的日期格式仅精确到最接近的1秒。您需要时间戳才能达到亚秒级的精度。请小心使用“时间戳”一词,因为它是一个与日期完全不同的数据类型的关键字,而且大多数人通常想要日期。这个问题似乎与主题无关,因为它是关于SQL的,并且属于。