触发多个表

时间:2011-03-17 15:19:27

标签: sql oracle triggers

我正在尝试创建一个触发器,它将从一个表中获取一个值,然后在另一个表中使用另一个值进行减法。

触发器将在表中运行(存款),然后我想将用户刚刚插入到存款表中的值取出并用另一个表(帐户)中的值减去它。获取以下代码进行编译没有问题:

CREATE OR REPLACE TRIGGER aifer_insättning 
AFTER INSERT
ON deposit
FOR EACH ROW
WHEN (new.belopp is not null)
BEGIN
UPDATE account SET SALDO = saldo + :new.belopp;
end;
/

但当然这个更新是表帐户中的行。我已经尝试了所有的东西让它只用了一行,但我无法得到它。有没有人有一些建议,我可以解决这个问题? 这是我的表:

SQL> desc account
 Name                                      Null?    Type
 ----------------------------------------- -------- ------------
 KNR                                       NOT NULL NUMBER(8)
 KTNR                                      NOT NULL NUMBER(6)
 REGDATUM                                  NOT NULL DATE
 SALDO                                              NUMBER(10,2)

SQL> desc deposit
 Name                                      Null?    Type
 ----------------------------------------- -------- ------------
 RADNR                                     NOT NULL NUMBER(9)
 PNR                                       NOT NULL VARCHAR2(11)
 KNR                                       NOT NULL NUMBER(8)
 BELOPP                                             NUMBER(10,2)
 DATUM                                     NOT NULL DATE

4 个答案:

答案 0 :(得分:2)

您是否只需要在触发器主体中的where语句中添加update子句?或者我错过了什么?

答案 1 :(得分:2)

假设公共列KNR是ACCOUNT的主键,我认为你想要的代码是:

CREATE OR REPLACE TRIGGER aifer_insättning 
    AFTER INSERT
    ON deposit
    FOR EACH ROW
    WHEN (new.belopp is not null)
BEGIN
    UPDATE account a
    SET a.SALDO = a.saldo + :new.belopp
    WHERE a.knr - :new.knr;
end;
/

请注意,我添加了一个表别名,以使代码更清晰。

答案 2 :(得分:0)

分隔符$$
在员工更新之前创建触发器ss_ss 对于每一行
开始   更新收货人设置
    created_by = NEW.employee_pin
    其中created_by = OLD.employee_pin;
结束 $$
分隔符;

注意 - > 员工和收货人是两张表

答案 3 :(得分:0)

**

为所有表生成触发器

** 好吧,我最初这样做是为数据库中的所有表生成触发器来审计数据更改,这很简单,只需将整行从已删除的表移动到镜像审计表。

但是有人想跟踪桌子上的活动,所以它更简单一些。在这里,我们创建了一个日志表,每当DML操作发生时,都会在那里写入。

享受

USE Northwind GO

CREATE TABLE LOG_TABLE (
  Add_dttm datetime DEFAULT (GetDate()),
  TABLE_NAME sysname,
  Activity char(6)
);

GO

DECLARE
  @sql varchar(8000),
  @TABLE_NAME sysname SET NOCOUNT ON

SELECT @TABLE_NAME = MIN(TABLE_NAME)
FROM INFORMATION_SCHEMA.Tables

WHILE @TABLE_NAME IS NOT NULL
BEGIN
  SELECT @sql = 'CREATE TRIGGER
  [' + @TABLE_NAME + '_Usage_TR]
    ON [' + @TABLE_NAME +'] '
    + 'FOR INSERT, UPDATE, DELETE AS '
    + 'IF EXISTS (SELECT * FROM inserted)
  AND NOT EXISTS (SELECT * FROM deleted) '
  + 'INSERT INTO LOG_TABLE
  (TABLE_NAME,Activity)
  SELECT ''' + @TABLE_NAME + ''', ''INSERT''' + ' '
  + 'IF EXISTS (SELECT * FROM inserted)
  AND EXISTS (SELECT * FROM deleted) '
  + 'INSERT INTO LOG_TABLE (TABLE_NAME,Activity) SELECT '''
  + @TABLE_NAME + ''', ''UPDATE''' + ' '
  + 'IF NOT EXISTS (SELECT * FROM inserted)
  AND EXISTS (SELECT * FROM deleted) '
  + 'INSERT INTO LOG_TABLE (TABLE_NAME,Activity)
  SELECT ''' + @TABLE_NAME + ''',
  ''DELETE''' + ' GO'

  SELECT @sql EXEC(@sql)

  SELECT @TABLE_NAME = MIN(TABLE_NAME)
  FROM INFORMATION_SCHEMA.Tables
  WHERE TABLE_NAME > @TABLE_NAME
END
SET NOCOUNT OFF