表名: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
列时,它应该使用当前日期(sysdate)自动更新update_pwd_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;
实际上我试图触发下方。但它不起作用。
创建或替换触发器用户_ trg
在user_tab上更新pwd
之前
对于每一行
宣布
Pragma
autonomous_transaction;
开始
更新user_tab设置pas_update = s
y s
日期p
w d
=:n
e w
。p w
d `;
承诺;
端;
请有人为此查询提供解决方案吗?
答案 0 :(得分: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。
需要考虑的事情......
答案 1 :(得分:1)
如果要更新正在更新的同一表/行中的列,则不应使用UPDATE语句。只需使用新值设置列。
:new.update_pwd_date := sysdate;
此外,不需要pragma自治事务或COMMIT。
答案 2 :(得分:0)
试试这个,
CREATE OR REPLACE
TRIGGER user_trg
BEFORE UPDATE OF pwd ON user_tab
FOR EACH row
BEGIN
:new.update_pwd_date := sysdate;
END;