标签: trigger

使用当前行和当前表名作为变量的触发函数(最后部分)

就像我的第一个问题中详细介绍的那样,我有一个Postgres 9.1数据库,其中有多个表,这些表具有完全相同的列名,它们仅在列值上有所不同:

tbl_log_a
tbl_log_b
tbl_log_c
...
Run Code Online (Sandbox Code Playgroud)

26 个表(从 a 到 z)。trfn_tbl_log_%letter%每个表都有一个触发器,它调用名为(from ato )的触发器函数z,该函数执行完全相同的操作:

CREATE OR REPLACE FUNCTION trfn_tbl_log_a_timetypespan()
  RETURNS trigger AS
$BODY$
DECLARE
v_timetype character varying;
v_timestmp_timetype timestamp without time zone;
v_timetypespan_resume interval;
v_stmtserial real;
v_sumtimetypespan_fnname interval;

BEGIN

IF NEW.timetype = 'lap' THEN
  SELECT timetype, timestmp, timetypespan FROM tbl_log_a WHERE fnname = NEW.fnname AND (timetype = 'start' OR timetype = 'resume') ORDER BY stmtserial DESC LIMIT 1 INTO v_timetype, v_timestmp_timetype, v_timetypespan_resume; …
Run Code Online (Sandbox Code Playgroud)

postgresql trigger dynamic-sql plpgsql postgresql-9.1

5
推荐指数
1
解决办法
274
查看次数

“TRUNCATE 不运行 ON DELETE 触发器” true 或 false

我正在搜索为什么 TRUNCATE 被放置在 DDL 而不是 DML 中的主题,我在这里找到了以下答案 Why is truncate DDL?

我这个答案我发现了一个句子如下

“TRUNCATE 不运行 ON DELETE 触发器这一事实也使其与正常的 DML 操作区分开来”

这与MYSQL 参考手册相冲突,其中说

“如果 FOREIGN KEY 约束指定 DELETE CASCADE,则子(引用)表中的行将被删除,并且截断的表将变为空。”

我正处于一种迷茫的状态。请详细说明这个问题。

谢谢

mysql trigger truncate ddl mysql-5.0

5
推荐指数
1
解决办法
3950
查看次数

在 PostgreSQL 触发器过程上指定 STRICT 有什么作用吗?

在 PostgreSQL 中的触发器过程上指定CALLED ON NULL INPUT, RETURNS NULL ON NULL INPUTor STRICT( https://www.postgresql.org/docs/current/static/sql-createfunction.html ) 会起到什么作用吗?

由于触发器过程必须声明为不带参数的函数(https://www.postgresql.org/docs/current/static/plpgsql-trigger.html),我怀疑它有任何效果,但我找不到明确的答案关于这一点。

postgresql trigger stored-procedures functions

5
推荐指数
0
解决办法
182
查看次数

为什么 UPDATE FROM 失败而 MERGE 在具有 INSTEAD OF 触发器的视图上运行?

有时为了重构,我使用视图来抽象更改并使用INSTEAD OF触发器来模仿以前的功能。

我过去遇到过错误 414(或 415)

不允许 UPDATE,因为该语句更新参与联接并具有 INSTEAD OF UPDATE 触发器的视图“%.*ls”。

我可以将其重写UPDATE FROMMERGE语句并且有效。但为什么?

我找到了这些参考资料,但没有一个能回答原因。

/sf/ask/215952551/

https://social.msdn.microsoft.com/Forums/sqlserver/en-US/87c173b0-8f87-4aa3-b861-d40f23803a43/views-and-instead-of-update-trigger-limitation-why?forum=transactsql

https://sqlserverfast.com/blog/hugo/2008/03/lets-deprecate-update-from/

trigger sql-server merge

5
推荐指数
1
解决办法
620
查看次数

MySQL 中的触发器与视图

出于性能原因,我们正在对大量数据进行非规范化处理。基本上,通常将 JOIN 超过 10 个表的 Query 替换为没有 JOIN 的 Query,但所有必要的数据都存储/缓存在初始表中。

我是触发器的坚定拥护者,它可以帮助我保持所有数据的更新绝对透明。公司中还有其他决策者反对使用触发器(出于多种原因)并建议改为构建 VIEW,希望 VIEW 已经针对更好的数据检索进行了优化。

在 MySQL 中是这种情况吗?

mysql trigger view

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

SQL Server 2005 根据行内日期限制更新或删除记录

我有两个 SQL Server 之间的事务复制。出于测试目的,我在订阅者处删除了许多仍然存在于发布者处的记录。

我现在知道,如果有人在发布者处更新或删除了我的订阅者上不存在的一些记录,那么我的复制将会崩溃。

我知道我也可以在分发服务器上过滤数据,但这意味着重新初始化我的订阅者,这意味着通过慢速链接传输近 40GB。

因此,当我测试我订阅的数据库时,我希望限制用户只能在发布者端更新或删除记录。我的源表有一个日期字段,我想根据日期限制更新或删除。

为此使用触发器还是约束更好?

如何尽可能避免记录锁定?

replication trigger sql-server-2005 sql-server constraint

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

MySQL 中的 BEFORE INSERT 触发器

我是 MySQL 的新手,我在创建BEFORE INSERT触发器时遇到了问题。

我收到一个unexpected END错误。

我有一个以verlof_aanvragen列命名的表datum(还有 6 列)。

我想要完成的只是日期介于now()+8和之间now()+365CURDATE() + INTERVAL 8 DAY AND CURDATE() + INTERVAL 365 DAY) 可以插入的行。日期超出该间隔的插入应该失败。

我使用的是 MySQL 5.5.24 版。

这是代码:

CREATE TRIGGER chk_dates  
BEFORE INSERT ON verlof_aanvragen  
FOR EACH ROW  
BEGIN  
  IF (NEW.datum < CURDATE() + INTERVAL 8 DAY OR NEW.datum > CURDATE() + INTERVAL 365 DAY) 
THEN  
    SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Any Message'

END IF  
END 
Run Code Online (Sandbox Code Playgroud)

mysql trigger mysql-5.5

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

子查询返回了 1 个以上的值

在我的数据库中,我有两个表:projectscomp_types. 创建新项目时,会触发一个触发器,该触发器会在projects表中的列中插入一个串联值。

一个完全工作的SQL Fiddle
请运行它,你会看到,它有效。

但是,当我尝试在 SQL Server 中运行它时,我收到以下错误:

子查询返回了 1 个以上的值。当子查询跟随 =、!=、<、<=、>、>= 或当子查询用作表达式时,这是不允许的。

截图:http : //i.stack.imgur.com/38rKV.jpg

SQL Server 中的所有表都是新鲜的,没有数据(就像小提琴一样)。
我究竟做错了什么?

trigger sql-server

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

如何对查询结果执行while循环

我在 MySQL 数据库中的列的 UPDATE 之后创建了一个触发器。当触发器检测到某个值时,它应该执行一些操作。这就是我目前所拥有的并且工作正常。

CREATE TRIGGER `order_gereed` AFTER UPDATE ON `oc_order`
FOR EACH ROW IF new.order_status_id = "15"
THEN
UPDATE push_voorraad SET actie = '1';
END IF
Run Code Online (Sandbox Code Playgroud)

但是现在我需要在new.order_status_id匹配 15时执行更多 SQL 。我不知道如何在纯 SQL 中执行此操作,但我现在可以在 php 中执行此操作。所以我希望通过发布我的 php 代码,有人可以告诉我如何在 SQL 中做到这一点。

$query = "SELECT
            oc_order_product.quantity,
            oc_order_option.option_value_id,
            product.id
          FROM oc_order_product
            JOIN oc_order_option
              ON oc_order_option.order_id = oc_order_product.order_id
            JOIN product
              ON product.oc_product_id = oc_order_product.model
          WHERE oc_order_product.order_id = '25' AND oc_order_product.store_url = 'http://www.someurl.com/'";

$result = $mysqli->query($query);
while($row = $result->fetch_object()){
  $query = "UPDATE product_option_value …
Run Code Online (Sandbox Code Playgroud)

mysql trigger stored-procedures

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

PostgreSQL:更新视图的触发器不起作用

我正在尝试使更新视图的触发器起作用。如果我正在做并插入它就可以了!但是当我尝试进行 UPDATE 时,它只是不运行。

CREATE OR REPLACE FUNCTION test_trigger_function()
RETURNS trigger AS
$$
    BEGIN
        RAISE NOTICE 'hi';
        RETURN NEW;
    END;
$$ LANGUAGE PLPGSQL;

CREATE TRIGGER test_trigger
INSTEAD OF INSERT OR UPDATE
    ON specific_view
        FOR EACH ROW
            EXECUTE PROCEDURE test_trigger_function();
Run Code Online (Sandbox Code Playgroud)

然后在另一个地方我执行它:

RAISE NOTICE 'before';
UPDATE specific_view SET gender='randomstuff';
RAISE NOTICE 'after';
Run Code Online (Sandbox Code Playgroud)

结果:

psql:test_function.pgsql:134: NOTICE:  before
psql:test_function.pgsql:134: NOTICE:  after
Run Code Online (Sandbox Code Playgroud)

插入时:

RAISE NOTICE 'before';
INSERT INTO specific_view (gender)
    VALUES ('randomstuff');
RAISE NOTICE 'after';
Run Code Online (Sandbox Code Playgroud)

返回:

psql:test_function.pgsql:134: NOTICE:  before
psql:test_function.pgsql:134: NOTICE:  hi
CONTEXT:  SQL statement "INSERT …
Run Code Online (Sandbox Code Playgroud)

postgresql trigger postgresql-9.3

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