在表中更新另一列时自动更新列

时间:2013-08-23 07:57:09

标签: sql oracle triggers

表名:User_table

Uname       pwd          expire_date          update_pwd_date
-------------------------------------------------------------
aaa         aaa          30-AUG-2013           null
bbb         bbb          01-SEP-2013           null
ccc         ccc          15-sep-2013           null
ddd         ddd          29-SEP-2013           null

因此,当我们要更新pwd列时,它应该使用当前日期(sysdate)自动更新update_pwd_date列。

我希望输出如下:

Uname       pwd          expire_date          update_pwd_date
-------------------------------------------------------------
aaa         eee          30-AUG-2013           23-AUG-2013
bbb         fff          01-SEP-2013           23-AUG-2013
ccc         ggg          15-sep-2013           23-AUG-2013
ddd         hhh          29-SEP-2013           23-AUG-2013

实际上我试图使用下面的触发器。但是它没有用。

create or replace trigger user_trg
before update of pwd
on user_tab
for each row
declare
Pragma autonomous_transaction;
begin
update user_tab set pas_update=sys date where pwd=:new.pwd;
commit;
end;

实际上我试图触发下方。但它不起作用。

创建或替换触发器用户_ trg 在user_tab上更新pwd之前 对于每一行 宣布 Pragma autonomous_transaction; 开始 更新user_tab设置pas_update = s y s日期p w d =:n e w。p w d `; 承诺; 端;

请有人为此查询提供解决方案吗?

3 个答案:

答案 0 :(得分:2)

我认为其他答案会为您提供触发所需的内容。

我不喜欢触发器。很多。并不是说它们不起作用,而是它们经常被忽视或被遗忘的依赖性。更短,他们是魔鬼。

也许我可以说服你以不同的方式尝试。

您已经在编写PL / SQL,为什么不创建API(包)?实际上这很简单。

create or replace
package maintain_user_table
as
  procedure update_user_pwd( p_uname in varchar2, p_new_pwd in varchar2 );
end;
/

假设: 1. uname是PK

create or replace
package body maintain_user_table
as
  procedure update_user_pwd( p_uname in varchar2, p_new_pwd in varchar2 )
  is
  begin
    --error checking can go here
    update user_table
      set pwd = p_new_pwd
        update_pwd_date = SYSDATE
    where uname = p_uname;

    if sql%rowcount = 1 then
      --update successful
    else if sql%rowcount = 0 then
      --no rows found
    else
      --more than one row updated, not good, probably rollback or something
    end if;
  end update_user_pwd;
end;
/

这样可以更严格地控​​制数据质量。将某个特定表保留为UPDATE / INSERT / DELETE,除了此过程意味着您只是希望所有人都遵循此特定规则(这就是为什么需要触发器)。取下扳机。关闭对此表的访问并强制人员/应用程序使用PL / SQL API。

需要考虑的事情......

答案 1 :(得分:1)

如果要更新正在更新的同一表/行中的列,则不应使用UPDATE语句。只需使用新值设置列。

:new.update_pwd_date := sysdate;

此外,不需要pragma自治事务或COMMIT。

答案 2 :(得分:0)

试试这个,

CREATE OR REPLACE 
TRIGGER user_trg 
     BEFORE UPDATE OF pwd ON user_tab 
     FOR EACH row 
BEGIN
     :new.update_pwd_date := sysdate;
END;
相关问题