标签: database-trigger

在删除之前应该返回什么触发器

我正在尝试制作简单的触发函数(Postgresql),但在所有这些情况下我都收到相同的错误“函数没有返回任何行” (只是简单的示例):

新的:

UPDATE somewhere SET something = something - 1;
RETURN NEW;
Run Code Online (Sandbox Code Playgroud)

老的:

UPDATE somewhere SET something = something - 1;
RETURN OLD;
Run Code Online (Sandbox Code Playgroud)

当我“删除之前”调用此函数时应该返回什么?(“插入/更新后”效果很好)

Tyvm 的提示!

按要求提供完整代码: 功能:

CREATE OR REPLACE FUNCTION pictogram_frequency_on_delete()
RETURNS trigger AS
$BODY$
DECLARE

new_frequency RECORD;
target_unit RECORD;
current_row RECORD;
units_with_same_type RECORD;
what RECORD; 

BEGIN
SET search_path TO 'myScheme';

CASE TG_OP
WHEN 'DELETED' THEN what := OLD;
ELSE what:= OLD;
END CASE;

SELECT unit_type_uid INTO STRICT target_unit 
FROM unit 
WHERE unit_uid = what.unit_uid;

SELECT …
Run Code Online (Sandbox Code Playgroud)

postgresql database-trigger

4
推荐指数
1
解决办法
6248
查看次数

使用触发器时出现 pl sql 错误

使用以下触发器时出现错误:

create or replace trigger t1
  after insert or update  
     on student_tbl 
  declare
   pragma autonomous_transaction;
    begin
   if inserting then

 insert into stud_fees_details(stud_id,fees_balance,total_fees) 
       select stud_id,course_fees,course_fees from student_tbl s,courses_tbl c where s.stud_standard_id=c.course_id;

 elsif updating('stud_standard_id') then

insert into stud_fees_details(stud_id,fees_balance,total_fees) 
select stud_id,course_fees,course_fees from student_tbl s,courses_tbl c where s.stud_standard_id=c.course_id;

 end if;
end;
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

错误是

ORA-06519: 检测到活动自治事务并回滚 ORA-06512: 在“SYSTEM.T1”,第 15 行 ORA-04088: 执行触发器“SYSTEM.T1”期间出错

oracle plsql oracle11g database-trigger

3
推荐指数
1
解决办法
1万
查看次数

如何更改Oracle中的触发器?

我正在尝试更改数据库的触发器脚本.我的触发器名称是ARCH_USER_UPD_TRG,它将USER表上的任何更新或删除放入Z_USER表中

我从USER表中删除一列,现在需要修改触发器脚本以不再使用此列.

如何修改oracle触发器的PL/SQL脚本?

oracle plsql alter database-trigger

3
推荐指数
1
解决办法
4374
查看次数

在 postgresql 中插入新行时触发更新表列?

我想在插入新行时编写触发器来更新表。我正在使用 updatea 查询,例如

UPDATE table SET
  geom = ST_SetSRID(ST_MakePoint(longitude, latitude), 4326) 
Run Code Online (Sandbox Code Playgroud)

postgresql database-trigger

3
推荐指数
1
解决办法
8387
查看次数

防止插入触发器

如何获得此触发器以防止前进不大于0或小于100的插入?谢谢.

DROP TRIGGER CheckAdvance;
CREATE OR REPLACE TRIGGER CheckAdvance
BEFORE INSERT OR UPDATE OF advance ON titles
FOR EACH ROW
WHEN (new.advance<0 OR new.advance>100)
BEGIN
dbms_output.put_line('Advance is Invalid.');
END;
Run Code Online (Sandbox Code Playgroud)

oracle plsql database-trigger

3
推荐指数
2
解决办法
6497
查看次数

在更新时触发更新列

我已经编写了这个函数和这个触发器:

CREATE OR REPLACE FUNCTION test4() RETURNS TRIGGER AS $BODY$
BEGIN
     UPDATE "cf"
     SET vol=(area*alt);
RETURN null;
END;
$BODY$
LANGUAGE plpgsql
Run Code Online (Sandbox Code Playgroud)

扳机

CREATE TRIGGER trig_upd
AFTER OR UPDATE ON "cf"
FOR EACH ROW
EXECUTE PROCEDURE test4();
Run Code Online (Sandbox Code Playgroud)

我已经测试了我的功能,没问题。所以我创建了触发器,但我无法在表“cf”中插入任何值,因为系统崩溃了。

postgresql plpgsql database-trigger

3
推荐指数
1
解决办法
5970
查看次数

在触发器内返回,安全吗?

我正在尝试查找有关触发器内 RETURN 效果的信息。我能找到的唯一文档是它“释放”触发器。

https://learn.microsoft.com/en-us/sql/t-sql/statements/create-trigger-transact-sql?view=sql-server-2017#optimizing-dml-triggers

我问的原因是最近添加的触发器导致了一些死锁问题,即使触发器为空也是如此。

这些示例非常荒谬(为什么要检索刚刚插入的数据),但这就是它的工作方式。生成这些语句的代码非常古老。

“空”触发器的主体

BEGIN
    SET NOCOUNT ON;
END
Run Code Online (Sandbox Code Playgroud)

表 1 上启用了空触发器

BEGIN TRANSACTION
    INSERT INTO Table1....                 -- Table1 becomes locked until transaction is committed

    SELECT * FROM Table1 WHERE ID = X...   -- deadlock

    INSERT INTO Table2...
COMMIT TRANSACTION
Run Code Online (Sandbox Code Playgroud)

空触发器已禁用

BEGIN TRANSACTION
    INSERT INTO Table1....                 -- Table1 DOES NOT BECOME LOCKED

    SELECT * FROM Table1 WHERE ID = X...

    INSERT INTO Table2...
COMMIT TRANSACTION
Run Code Online (Sandbox Code Playgroud)

在触发器末尾添加 RETURN 会释放锁,从而防止死锁。

这安全吗?我唯一能想到的是如果触发器修改了它所在的表,释放锁可能会导致脏读。

t-sql sql-server database-trigger

3
推荐指数
1
解决办法
9720
查看次数

SQL Server到Oracle语言翻译器

我在Microsoft SQL Server中创建了一个触发器,我试图将其引入Oracle SQL Developer.我意识到语法和语言有点不同.我慢慢地,但肯定地试图通过每一行,但任何帮助或指导非常感谢.

Microsoft SQL Server中我尝试将其转移到Oracle的触发器:

CREATE TRIGGER Production.Product_Price_Check
ON AdventureWorks.Production.Product FOR UPDATE
AS 
    DECLARE @min_price money; --to keep minimum price
    DECLARE @new_price money; --to keep new price from update query

    SELECT @min_price = (SELECT StandardCost*1.2 FROM INSERTED);
    SELECT @new_price = (SELECT ListPrice FROM INSERTED)
    IF @new_price < @min_price
       BEGIN
            ROLLBACK TRANSACTION
            -- Rolls back an explicit or implicit transaction to the beginning of the transaction
            PRINT('the price can’t be below ' + cast(@min_price as varchar(20)));
            -- cast …
Run Code Online (Sandbox Code Playgroud)

oracle plsql database-trigger

3
推荐指数
2
解决办法
88
查看次数

PostgreSQL:检查触发器函数中的NEW和OLD

我想创建一个对行进行计数并更新另一个表中的字段的触发器。我当前的解决方案适用于INSERT语句,但是当我删除一行时失败。

我当前的功能:

 CREATE OR REPLACE FUNCTION update_table_count()
RETURNS trigger AS
$$
DECLARE updatecount INT;
  BEGIN
      Select count(*) into updatecount 
        From source_table 
       Where id = new.id;
      Update dest_table set count=updatecount 
       Where id = new.id;
RETURN NEW;
END;
$$
LANGUAGE 'plpgsql';
Run Code Online (Sandbox Code Playgroud)

触发器是一个非常基本的触发器,看起来像。

CREATE TRIGGER count_trigger
AFTER INSERT OR DELETE
ON source_table
FOR EACH ROW
EXECUTE PROCEDURE update_table_count();
Run Code Online (Sandbox Code Playgroud)

当我执行DELETE语句时,会发生以下错误:

错误:记录“新”尚未分配

详细信息:尚未分配的记录的元组结构是不确定的。

我知道一个解决方案可能是只为DELETE创建一组触发器和函数,为INSERT语句创建一组触发器和函数。但是我想做得更优雅一些,并且想知道,是否有一种解决方案可以检查当前上下文中是否存在NEW或OLD并仅实现IF ELSE块。但我不知道如何检查此上下文相关项。

谢谢你的帮助

postgresql plpgsql database-trigger postgresql-9.5

2
推荐指数
1
解决办法
1499
查看次数

触发编译但不插入行

我正在尝试创建一个触发器,该触发器在触发时将数据插入到具有USER和SYSDATE数据的另一个表中。脚本但未从TRIGGER插入任何数据。

我正在运行Oracle Server。

 SET SERVEROUTPUT ON;

  CREATE TABLE dept1
 ( DEPTNO NUMBER(3) PRIMARY KEY,
  DNAME VARCHAR2(20),
  LOC VARCHAR2(20)
 );

 CREATE TABLE dept1_shadow
 ( DEPTNO NUMBER(3) PRIMARY KEY,
  DNAME VARCHAR2(20),
  LOC VARCHAR2(20),
  USER_ VARCHAR2(32),
  MODTIME CHAR(17)
  );

 INSERT INTO dept1 VALUES (10, 'ACCOUNTING', 'NEW YORK');    
 INSERT INTO dept1 VALUES (20, 'RESEARCH',   'DALLAS');    
 INSERT INTO dept1 VALUES (30, 'SALES',      'CHICAGO');   
 INSERT INTO dept1  VALUES (40, 'OPERATIONS', 'WASHINGTON (D.C.)');    
 INSERT INTO dept1  VALUES (50, 'MARKETING', 'BOSTON');


CREATE OR REPLACE TRIGGER row_dept1_trigger
 AFTER INSERT …
Run Code Online (Sandbox Code Playgroud)

sql oracle plsql database-trigger

2
推荐指数
1
解决办法
50
查看次数