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
ys
日期,其中p
wd
=:n
ew
.pw
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
<>…………