标签: trigger

在 MySQL 中触发以防止插入

我想创建一个触发器,以防止在numflights不存在的航班 ( )的预订表中插入。

Tables
----------------------------------------------
flights(numflight, origine, destination, dep, arr)
airports(code, city, country)
reservation(people, numflight, date_travel)
Run Code Online (Sandbox Code Playgroud)

originedestination包含机场代码。

mysql trigger

8
推荐指数
1
解决办法
6443
查看次数

使用 MySQL 触发器或事务?

我想询问您对在网站中使用 MySQL 触发器或事务的意见。

实际上我有一个payment带有 -的历史表UserId | OperationId | Comment | Credits | Sign (debit or credit)。所以每个支付操作都插入到这个表中。

但是,每次用户每次操作时,计算其总信用额度将是耗时的。所以我认为将每个用户的总信用金额保留在用户profile表中可能是一个好主意。

这是问题所在。我如何确保表中的总信用金额profile将与payment历史表中的操作保持同步?

我想使用两种方法:

  • MySQL触发器或
  • 源代码中编码的交易

哪个更靠谱?如果我有大型数据库(超过 100.000 个用户)怎么办?

你有什么建议来做到这一点吗?

BD MySQL 引擎是 InnoDB。

mysql innodb trigger performance transaction

8
推荐指数
1
解决办法
6679
查看次数

明智地使用触发器来更新另一个表?

我有一个Object表,它是从另一个数据库的集成服务(如果需要,我可以更改)填充的。在某些时候,我们需要在另一个表中手动添加帖子,ObjectObjectGroup (ObjectId, ObjectGroupId)如果Object.ObjectType有某个整数值,则需要该表。由于集成服务不处理这种更新,我正在考虑向 Object 表添加一个触发器,其伪代码如下:

if Object.ObjectType = 10
    begin
        if Object.ObjectNumber like '<string pattern>'
        begin
            insert into ObjectObjectGroup values...
        end
    end
Run Code Online (Sandbox Code Playgroud)

这种设置是明智的,还是在性能方面有更好的方法?

trigger sql-server

8
推荐指数
1
解决办法
4558
查看次数

如何在使用而不是触发器时插入最后一个标识行

当我插入表使用INSTEAD OF触发器,@@IdentityIDENT_CURRENT('Table')SCOPE_IDENTITY()返回null。如何获取插入行的最后一个标识?

trigger sql-server-2008 sql-server t-sql identity

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

在复制(目标)数据库上使用触发器时的注意事项

我们的 SQL Sever 2008 应用程序数据库从服务器 A 复制到服务器 B(推送复制)。我们使用服务器 B 上的副本(我们称之为 database_b)来创建报告并运行其他查询,以便我们的报告不会干扰应用程序。目前,我们利用低效的视图在 database_b 中跨多个表组合数据,以便为我们的报告编写者(具有基本 SQL 技能)简化报告编写。

99.9% 的数据库活动是 INSERTS,所以我们正在探索一种用我们可以优化的表替换低效视图的方法。这是一个简化的示例:

有一个appointment表和一个location(查找)表。每次安排新约会时,都会向appointment表中添加一行。每次这个 INSERT 发生时,我想把appointment_id它和它对应的位置名称(location_id从两个表连接)插入到一个报告表中。

我已经通过服务器 B 上 database_b 中的约会表上的触发器完成了此操作。

我的问题是 - 鉴于 database_b 是复制副本,是否有任何特殊考虑?我是否需要担心失败的触发器会破坏整个(推送)复制过程?还有什么我想念的吗?

不幸的是,在我们的开发环境中很难对此进行测试,因此我没有机会进行大量的反复试验。

replication trigger sql-server

8
推荐指数
1
解决办法
6185
查看次数

MySQL 创建全局例程(存储过程和/或函数)的可能性

是否有可能以某种方式定义全局可用的例程?似乎每个例程都必须在数据库范围内创建。

当我尝试从控制台创建一个例程(没有事先发布use dbname)时,我收到一个错误:

ERROR 1046 (3D000): No database selected

我们有大量相同的数据库(数据不同),目标是为某些表名创建一些触发器。但是我们只想运行一个例程,所以我们不必为每个数据库创建这些例程(因为它们是相同的,例程对每个数据库的工作方式相同)。

mysql trigger stored-procedures functions

8
推荐指数
1
解决办法
5957
查看次数

从触发器调用多个函数?

我运行PostgreSQL-9.2.4

是否可以从触发器调用 2 个函数?

假设以下触发器触发时,我有两个函数可以执行两个不同的表:

扳机:

CREATE TRIGGER start ON system_status FOR EACH ROW
WHEN ((new.event = start_task))
EXECUTE PROCEDURE ...()
Run Code Online (Sandbox Code Playgroud)

功能 1:( 当任务开始时 => 删除任何先前为此系统分配的下一个任务)

CREATE FUNCTION void_next_task() RETURNS trigger AS $$

BEGIN
  DELETE FROM tasks_status ts
  WHERE ts.system = NEW.system
  AND ts.event = 'next_task';
  RETURN NEW;
  END;

$$

LANGUAGE plpgsql
Run Code Online (Sandbox Code Playgroud)

功能 2:( 如果插入的组合tasksystem已经出现在表中=> 将此组合标记为任何较早的记录deleted

CREATE FUNCTION void_dup_task() RETURNS trigger AS $$

BEGIN
  UPDATE system_status ss
  SET deleted = 'TRUE'
  WHERE ss.system …
Run Code Online (Sandbox Code Playgroud)

postgresql trigger plpgsql functions

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

如何创建 Postgres 触发器以确保字段不可更新

我正在尝试创建一个 Postgres 触发器,以确保在设置列的值后,它无法更新(基本上使其成为只读)。到目前为止,我已经提出了以下草案触发器。

1) 首先,我在正确的轨道上吗?
2) 有回报价值NEW吗?
3) 我必须original_idNEW.?

CREATE FUNCTION check_id_change() RETURNS TRIGGER AS $$
    BEGIN
        IF OLD.original_id <> NEW.original_id THEN
            RAISE EXCEPTION 'cannot change original_id'; 
        END IF;
        RETURN NEW;
    END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER client_update_trigger AFTER UPDATE ON client FOR EACH ROW
      EXECUTE PROCEDURE check_id_change();
Run Code Online (Sandbox Code Playgroud)

postgresql trigger

8
推荐指数
2
解决办法
7241
查看次数

PostgreSQL 在查询 INSTEAD OF 触发器时使用 NEW

我无法让 INSTEAD OF 触发器正常工作,而且我想我误解了如何使用 NEW。考虑以下简化场景:

CREATE TABLE Product (
  product_id SERIAL PRIMARY KEY,
  product_name VARCHAR
);
CREATE TABLE Purchase (
  purchase_id SERIAL PRIMARY KEY,
  product_id INT REFERENCES Product,
  when_bought DATE
);

CREATE VIEW PurchaseView AS
SELECT purchase_id, product_name, when_bought
FROM Purchase LEFT JOIN Product USING (product_id);
Run Code Online (Sandbox Code Playgroud)

我希望能够创建INSTEAD OF触发器以允许我直接插入到 中PurchaseView,例如:

INSERT INTO Product(product_name) VALUES ('foo');
INSERT INTO PurchaseView(product_name, when_bought) VALUES ('foo', NOW());
Run Code Online (Sandbox Code Playgroud)

我的想法是这样的:

CREATE OR REPLACE FUNCTION insert_purchaseview_func()
  RETURNS trigger AS
$BODY$
BEGIN
  INSERT INTO Purchase(product_id, when_bought) …
Run Code Online (Sandbox Code Playgroud)

postgresql trigger syntax plpgsql

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

PostgreSQL:使用自定义列自动更新 updated_at

以前,我会将多个表合并为一个并返回结果,但在许多表中我有相同的列名。这就是为什么我决定用表名作为列名的前缀。但这打破了我必须自动更新我的updated_at专栏的触发器。

这是我的功能:

CREATE OR REPLACE FUNCTION update_updated_at()
  RETURNS TRIGGER AS $$
  BEGIN
      NEW.updated_at = now();
      RETURN NEW;
  END;
  $$ language 'plpgsql';
Run Code Online (Sandbox Code Playgroud)

我会添加一个触发器,如:

CREATE TRIGGER update_users_updated_at
  BEFORE UPDATE ON users
  FOR EACH ROW EXECUTE PROCEDURE update_updated_at();
Run Code Online (Sandbox Code Playgroud)

但是现在我的专栏被命名了users_updated_at,这不起作用。我的问题是有什么方法可以将列名传递给触发器并更新传递的列,还是有其他我不知道的方法?

postgresql trigger plpgsql functions row-modification-time

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