我正在尝试制作简单的触发函数(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) 使用以下触发器时出现错误:
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”期间出错
我正在尝试更改数据库的触发器脚本.我的触发器名称是ARCH_USER_UPD_TRG,它将USER表上的任何更新或删除放入Z_USER表中
我从USER表中删除一列,现在需要修改触发器脚本以不再使用此列.
如何修改oracle触发器的PL/SQL脚本?
我想在插入新行时编写触发器来更新表。我正在使用 updatea 查询,例如
UPDATE table SET
geom = ST_SetSRID(ST_MakePoint(longitude, latitude), 4326)
Run Code Online (Sandbox Code Playgroud) 如何获得此触发器以防止前进不大于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) 我已经编写了这个函数和这个触发器:
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”中插入任何值,因为系统崩溃了。
我正在尝试查找有关触发器内 RETURN 效果的信息。我能找到的唯一文档是它“释放”触发器。
我问的原因是最近添加的触发器导致了一些死锁问题,即使触发器为空也是如此。
这些示例非常荒谬(为什么要检索刚刚插入的数据),但这就是它的工作方式。生成这些语句的代码非常古老。
“空”触发器的主体
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 会释放锁,从而防止死锁。
这安全吗?我唯一能想到的是如果触发器修改了它所在的表,释放锁可能会导致脏读。
我在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) 我想创建一个对行进行计数并更新另一个表中的字段的触发器。我当前的解决方案适用于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块。但我不知道如何检查此上下文相关项。
谢谢你的帮助
我正在尝试创建一个触发器,该触发器在触发时将数据插入到具有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) database-trigger ×10
oracle ×5
plsql ×5
postgresql ×4
plpgsql ×2
alter ×1
oracle11g ×1
sql ×1
sql-server ×1
t-sql ×1