0

表名: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列时,它应该update_pwd_date使用当前日期(sysdate)自动更新列。

我想要像这样的输出:

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 在更新pwd用户选项卡上的每一行声明 Pragma 自治事务之前创建或替换触发器用户_;开始更新 user_tab set pas_update= sy sdate where pw d=: ne w.p wd`; 犯罪; 结尾;

请问有人可以为这个查询提供解决方案吗?

4

3 回答 3

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。

只是要考虑的事情...

于 2013-08-24T03:34:10.263 回答
1

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

:new.update_pwd_date := sysdate;

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

于 2013-08-23T08:12:26.240 回答
0

尝试这个,

CREATE OR REPLACE 
TRIGGER user_trg 
     BEFORE UPDATE OF pwd ON user_tab 
     FOR EACH row 
BEGIN
     :new.update_pwd_date := sysdate;
END;
于 2013-08-23T08:54:00.663 回答