自动更新一列,当另一列在一个表中
问题描述:
表名称更新: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 = s
s
Ý日期其中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。
只是要考虑...