我正在尝试创建一个触发器,它将从一个表中获取一个值,然后在另一个表中使用另一个值进行减法。
触发器将在表中运行(存款),然后我想将用户刚刚插入到存款表中的值取出并用另一个表(帐户)中的值减去它。获取以下代码进行编译没有问题:
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
答案 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