数据库中两张表如何建立触发器,使其中一张表某个字段更新时,另一个表的某个字段发生相应的变化?详细如下:

时间:2022-05-08 14:54:08
现有两张表,table1和table2:如下:
create table table1
字段1            VARCHAR2(255),
字段2            VARCHAR2(255),
字段3            VARCHAR2(255),
字段4            VARCHAR2(255),
字段5            VARCHAR2(255)
)

create table table2
字段6            VARCHAR2(255),
字段7            VARCHAR2(255),
字段8            VARCHAR2(255),
字段9            VARCHAR2(255),
字段10           VARCHAR2(255)
)
现在我想创建一个触发器:当 table1中的 某些字段,如字段1,或字段2..发生改变,则触发table2中的字段也发生相应的变化,如table2中字段6的值变成1,table2中字段7变成2,等,这种触发器改如何编写,说明下,是Oracle数据库,小弟新手,,请高手指点,谢谢!

12 个解决方案

#1



--触发器简单,但是根据你的描述 你的 table1 和 table2 需要一个关联条件,假设关联条件为 字段5=字段10
create or replace trigger table1_trigger
after update on table1
for each row
begin
  update table2
     set 字段6=1,
         字段7=2
   where 字段10 := old.字段5; --这里的条件是假设的,你根据你自己的实际情况处理。
end;

#2


--建议你直接读下触发器的创建过程,就会了。
例子:
CREATE OR REPLACE TRIGGER `<databaseName>`.`<triggerName>`
  < [ BEFORE | AFTER ] > < [ INSERT | UPDATE | DELETE ] >
  ON <tableName>
  FOR EACH ROW
  BEGIN
  --do something
  END

#3


你好,如果我只是当table1中的某一个字段,而非任意字段,如字段3发生改变时才引发触发器,改如何修改,谢谢
引用 1 楼 benchim888 的回复:
SQL code

--触发器简单,但是根据你的描述 你的 table1 和 table2 需要一个关联条件,假设关联条件为 字段5=字段10
create or replace trigger table1_trigger
after update on table1
for each row
begin
  update table2
     set 字段6=1,
         字段……

#4


CREATE OR REPLACE TRIGGER TG_SALARYMONTHINFO
  AFTER UPDATE ON T_SALARYAGENCYMONTHSALINFO
  FOR EACH ROW
BEGIN
  UPDATE T_SALARY_SALARIESDATA SET T_SALARY_SALARIESDATA.text1 =1 WHERE Bdgagency:= OLD.Bdgagency;
END;



如此代码编译时提示有编译错误,请问各位错误再哪?

#5


引用 1 楼 benchim888 的回复:
SQL code

--触发器简单,但是根据你的描述 你的 table1 和 table2 需要一个关联条件,假设关联条件为 字段5=字段10
create or replace trigger table1_trigger
after update on table1
for each row
begin
  update table2
     set 字段6=1,
    ……

+1

#6


+1 ?什么意思?
引用 5 楼 njlywy 的回复:
引用 1 楼 benchim888 的回复:
SQL code

--触发器简单,但是根据你的描述 你的 table1 和 table2 需要一个关联条件,假设关联条件为 字段5=字段10
create or replace trigger table1_trigger
after update on table1
for each row
begin
update table2……

#7


引用 4 楼 zxffling 的回复:
BEGIN
  UPDATE T_SALARY_SALARIESDATA SET T_SALARY_SALARIESDATA.text1 =1 WHERE Bdgagency:= OLD.Bdgagency;
END;



如此代码编译时提示有编译错误,请问各位错误再哪?

应当是Bdgagency:= OLD.Bdgagency;有错误,不要那个冒号,带冒号是赋值用的,在SQL里不要带上它。其次你的这个逻辑有问题,在一下贴我详细说明。

#8


BEGIN
UPDATE T_SALARY_SALARIESDATA SET T_SALARY_SALARIESDATA.text1 =1 WHERE Bdgagency:= OLD.Bdgagency;
END;

上面这段代码的逻辑是错误的,错误内容有两点:
1. 不管bdgagency列是否有变化,都会将T_SALARY_SALARIESDATA.text1设为1
2. 使用bdgagency列做为where条件,需要保证Bdgagency是表T_SALARY_SALARIESDATA的主键或者唯一索引。否则请使用主键做为where条件,以免更新了其它不应当更新的数据。

-- 假设两表中都存在列R_ID,且该列为主键
if ( OLD.Bdgagency <> NEW.Bdgagency) then
    UPDATE T_SALARY_SALARIESDATA SET T_SALARY_SALARIESDATA.text1 =1 WHERE R_ID = OLD.R_ID;
end if;

#9


这么明显的错误,还+1!

where col1 = :old.col1;

引用 5 楼 njlywy 的回复:
引用 1 楼 benchim888 的回复:
SQL code

--触发器简单,但是根据你的描述 你的 table1 和 table2 需要一个关联条件,假设关联条件为 字段5=字段10
create or replace trigger table1_trigger
after update on table1
for each row
begin
update table2
……

#10



--触发器简单,但是根据你的描述 你的 table1 和 table2 需要一个关联条件,假设关联条件为 字段5=字段10
create or replace trigger table1_trigger
after update of 字段3 on table1
for each row
begin
  update table2
     set 字段6=1,
         字段7=2
   where 字段10 = :old.字段5; --这里的条件是假设的,你根据你自己的实际情况处理。
end;

引用 3 楼 zxffling 的回复:
你好,如果我只是当table1中的某一个字段,而非任意字段,如字段3发生改变时才引发触发器,改如何修改,谢谢
引用 1 楼 benchim888 的回复:

SQL code

--触发器简单,但是根据你的描述 你的 table1 和 table2 需要一个关联条件,假设关联条件为 字段5=字段10
create or replace trigger table1_trigger
……

#11


10楼时根据字段。。 of 字段名。。其他的都是update表的时候

#12


 触发器简单多了

#1



--触发器简单,但是根据你的描述 你的 table1 和 table2 需要一个关联条件,假设关联条件为 字段5=字段10
create or replace trigger table1_trigger
after update on table1
for each row
begin
  update table2
     set 字段6=1,
         字段7=2
   where 字段10 := old.字段5; --这里的条件是假设的,你根据你自己的实际情况处理。
end;

#2


--建议你直接读下触发器的创建过程,就会了。
例子:
CREATE OR REPLACE TRIGGER `<databaseName>`.`<triggerName>`
  < [ BEFORE | AFTER ] > < [ INSERT | UPDATE | DELETE ] >
  ON <tableName>
  FOR EACH ROW
  BEGIN
  --do something
  END

#3


你好,如果我只是当table1中的某一个字段,而非任意字段,如字段3发生改变时才引发触发器,改如何修改,谢谢
引用 1 楼 benchim888 的回复:
SQL code

--触发器简单,但是根据你的描述 你的 table1 和 table2 需要一个关联条件,假设关联条件为 字段5=字段10
create or replace trigger table1_trigger
after update on table1
for each row
begin
  update table2
     set 字段6=1,
         字段……

#4


CREATE OR REPLACE TRIGGER TG_SALARYMONTHINFO
  AFTER UPDATE ON T_SALARYAGENCYMONTHSALINFO
  FOR EACH ROW
BEGIN
  UPDATE T_SALARY_SALARIESDATA SET T_SALARY_SALARIESDATA.text1 =1 WHERE Bdgagency:= OLD.Bdgagency;
END;



如此代码编译时提示有编译错误,请问各位错误再哪?

#5


引用 1 楼 benchim888 的回复:
SQL code

--触发器简单,但是根据你的描述 你的 table1 和 table2 需要一个关联条件,假设关联条件为 字段5=字段10
create or replace trigger table1_trigger
after update on table1
for each row
begin
  update table2
     set 字段6=1,
    ……

+1

#6


+1 ?什么意思?
引用 5 楼 njlywy 的回复:
引用 1 楼 benchim888 的回复:
SQL code

--触发器简单,但是根据你的描述 你的 table1 和 table2 需要一个关联条件,假设关联条件为 字段5=字段10
create or replace trigger table1_trigger
after update on table1
for each row
begin
update table2……

#7


引用 4 楼 zxffling 的回复:
BEGIN
  UPDATE T_SALARY_SALARIESDATA SET T_SALARY_SALARIESDATA.text1 =1 WHERE Bdgagency:= OLD.Bdgagency;
END;



如此代码编译时提示有编译错误,请问各位错误再哪?

应当是Bdgagency:= OLD.Bdgagency;有错误,不要那个冒号,带冒号是赋值用的,在SQL里不要带上它。其次你的这个逻辑有问题,在一下贴我详细说明。

#8


BEGIN
UPDATE T_SALARY_SALARIESDATA SET T_SALARY_SALARIESDATA.text1 =1 WHERE Bdgagency:= OLD.Bdgagency;
END;

上面这段代码的逻辑是错误的,错误内容有两点:
1. 不管bdgagency列是否有变化,都会将T_SALARY_SALARIESDATA.text1设为1
2. 使用bdgagency列做为where条件,需要保证Bdgagency是表T_SALARY_SALARIESDATA的主键或者唯一索引。否则请使用主键做为where条件,以免更新了其它不应当更新的数据。

-- 假设两表中都存在列R_ID,且该列为主键
if ( OLD.Bdgagency <> NEW.Bdgagency) then
    UPDATE T_SALARY_SALARIESDATA SET T_SALARY_SALARIESDATA.text1 =1 WHERE R_ID = OLD.R_ID;
end if;

#9


这么明显的错误,还+1!

where col1 = :old.col1;

引用 5 楼 njlywy 的回复:
引用 1 楼 benchim888 的回复:
SQL code

--触发器简单,但是根据你的描述 你的 table1 和 table2 需要一个关联条件,假设关联条件为 字段5=字段10
create or replace trigger table1_trigger
after update on table1
for each row
begin
update table2
……

#10



--触发器简单,但是根据你的描述 你的 table1 和 table2 需要一个关联条件,假设关联条件为 字段5=字段10
create or replace trigger table1_trigger
after update of 字段3 on table1
for each row
begin
  update table2
     set 字段6=1,
         字段7=2
   where 字段10 = :old.字段5; --这里的条件是假设的,你根据你自己的实际情况处理。
end;

引用 3 楼 zxffling 的回复:
你好,如果我只是当table1中的某一个字段,而非任意字段,如字段3发生改变时才引发触发器,改如何修改,谢谢
引用 1 楼 benchim888 的回复:

SQL code

--触发器简单,但是根据你的描述 你的 table1 和 table2 需要一个关联条件,假设关联条件为 字段5=字段10
create or replace trigger table1_trigger
……

#11


10楼时根据字段。。 of 字段名。。其他的都是update表的时候

#12


 触发器简单多了