自动更新一列,当另一列在一个表中

问题描述:

表名称更新: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 

其实我尝试使用下面trigger.But它不工作。

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; 

其实我想下面trigger.But它不工作。

创建或user_tab 的pwd更新之前更换触发用户_ trg 为每一行 申报 Pragma AUTONOMOUS_TRANSACTION; 开始 更新user_tab设置pas_update = ssÝ日期其中p瓦特d =:nÈw .P w D`; 承诺; 结束;

请有人可以给这个查询的解决方案吗?

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

:new.update_pwd_date := sysdate; 

另外,不需要编译指示自主事务或COMMIT。

试试这个,

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

我觉得其他的答案会给你你需要什么触发。

我不喜欢触发器。很多。并不是说他们不工作,而是他们经常被忽视或被遗忘。更短,他们是魔鬼。

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

您已经在编写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。

只是要考虑...