Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在表中更新另一列时自动更新列_Sql_Oracle_Triggers - Fatal编程技术网

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

Sql 在表中更新另一列时自动更新列,sql,oracle,triggers,Sql,Oracle,Triggers,表名称:用户\表 Uname pwd expire_date update_pwd_date ------------------------------------------------------------- aaa aaa 30-AUG-2013 null bbb bbb 01-SEP-2013 null ccc c

表名称:用户\表

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\u pwd\u 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;

事实上,我正试图低于触发,但它不起作用

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;
创建或替换触发器用户 更新用户选项卡上的
pwd
之前 每行 声明
Pragma
自主交易; 开始 更新用户选项卡设置pas\U更新=
s
y
s
日期,其中
p
w
d
=:
n
e
w
.p
w
d`; 犯罪 结束


请问有谁能给出这个问题的答案

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

:new.update_pwd_date := sysdate;

另外,不需要使用pragma自治事务或COMMIT。

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

:new.update_pwd_date := sysdate;
另外,不需要pragma自治事务或提交。

试试这个

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

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;
/
这将允许您更严格地控制数据的质量。将某个特定的表保留为打开状态,以便从除此过程之外的任何内容中进行更新/插入/删除,这意味着您希望每个人都遵循此特定规则(这就是为什么触发器是必需的)。卸下扳机。关闭对此表的访问并强制人员/应用程序使用PL/SQL API


<> P> >我想其他答案会给你触发所需的。< /P> 我不喜欢触发器。很多并不是说它们不起作用,而是它们经常被忽视或被遗忘。总之,他们是魔鬼

也许我能说服你换一种方式试试

您已经在编写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;
/
这将允许您更严格地控制数据的质量。将某个特定的表保留为打开状态,以便从除此过程之外的任何内容中进行更新/插入/删除,这意味着您希望每个人都遵循此特定规则(这就是为什么触发器是必需的)。卸下扳机。关闭对此表的访问并强制人员/应用程序使用PL/SQL API

<>…………