标签: trigger

如何为 SQL Server 重写为 Oracle 编写的触发器?

如何为 SQL Server 重写最初为 Oracle 编写的触发器?

这是我的 Oracle 触发器代码:

CREATE OR REPLACE TRIGGER P000KUL_TEST
BEFORE
INSERT
ON P000KUL
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
BEGIN
SELECT TO_CHAR(SYSDATE, 'dd/mm/RRRR') INTO :NEW.SYSTEM_DATE FROM DUAL;
SELECT TO_CHAR(SYSDATE, 'hh:mi') INTO :NEW.SYSTEM_TIME FROM DUAL;
END; 
Run Code Online (Sandbox Code Playgroud)

trigger sql-server-2008 oracle

9
推荐指数
1
解决办法
661
查看次数

如何知道哪个存储过程或触发器正在使用 SQL Server 2008 R2 上的表?

在这种情况下,在我正在检查的数据库中,有一个保存用户历史记录的存档表,并且有一个触发器或存储过程在一段时间后从该表中删除行,以避免数据过大同样,我没有设计DB,我只是在维护一个使用这个DB的应用程序,所以我不知道这些存储过程或触发器的名称,我想做的是定位这个存储过程或触发器,检查代码并修改它以在表上保留更长的“用户历史记录”。

有人告诉我检查“sysobjects”表,在那里我实际上可以看到与表同名的东西,但这是我能够检索的唯一信息,有什么建议吗?

谢谢你。

trigger sql-server-2008 stored-procedures

9
推荐指数
1
解决办法
6775
查看次数

有没有办法确保执行 SQL Server 触发器?

我的主管对在流程中使用触发器犹豫不决,因为如果恰逢网络中断,流程将无法完成。SQL Server 是否在调用过程的事务中包含触发器?如果没有,实现这一点的最佳方法是什么?

trigger sql-server

9
推荐指数
2
解决办法
5059
查看次数

PostgreSQL下如何指定触发器执行顺序?

我正在使用触发器使用“经典”基于时间的分区。我发现需要一个单独的触发器,它在原始表上运行。

CREATE TABLE twitter_interactions(...);
CREATE OR REPLACE FUNCTION insert_twitter_interactions ...;
CREATE TRIGGER insert_twitter_interactions_trig
  BEFORE INSERT OR UPDATE on twitter_interactions
  FOR EACH ROW EXECUTE PROCEDURE insert_twitter_interactions();

CREATE OR REPLACE FUNCTION maintain_data_pointers ...;
CREATE TRIGGER maintain_data_pointers_trig
  BEFORE INSERT OR UPDATE on twitter_interactions
  FOR EACH ROW EXECUTE PROCEDURE insert_twitter_interactions();
Run Code Online (Sandbox Code Playgroud)

我还没有完全验证,但我怀疑分区逻辑在维护触发器之前运行,并且由于该行没有出现在父表中,因此第二个触发器永远不会触发。

如果我也想运行,会发生什么AFTER INSERT OR UPDATE?由于该行未将其放入原始表中,因此我无法实现 after 逻辑。

postgresql trigger

9
推荐指数
2
解决办法
9287
查看次数

创建触发器以更新另一个服务器数据库上的表数据

我正在 MySQL 中创建一个触发器,我需要一些帮助。

我在 2 个不同的 Web 服务器 S1 和 S2 上有 2 个网站、2 个数据库(同名)。

这些数据库具有相同的表名。

我希望两个网站上的用户数据都相同。

因此,如果一个用户在 S1 上注册,那么该用户注册信息应该传递给 S2。

如果在 S1 上更新了用户注册信息,则应在 S2 上更新相同的信息。

这同样适用于 S2。

如何创建触发器,以便每次在 S1 上的数据库中进行插入/更新/删除时,S2 上的用户表也会自动更新。

并且每次在 S2 上的数据库中进行插入/更新/删除操作时,S1 上的用户表也会自动更新。

这可能吗?你能提供一些例子吗?

mysql trigger

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

使用共享登录时,如何知道用户对审计表执行删除操作?

背景资料:

  • 我正在创建一组审计表,以跟踪我的应用程序对一组数据表的更新和删除。
  • 审计记录是通过触发器创建的。
  • 我的应用程序数据库中的 DML 通常来自服务用于进入数据库的登录名。因此,我认为SYSTEM_USER在触发器中调用时,结果总是相同的。
  • 我的应用程序当前不存储用户数据,尽管UserId每次完成 DML 时都会为其提供一个字符串(仅在存储过程中完成)。

我遇到的问题是,当用户删除记录时,我想知道是谁做的。因为它将通过相同的登录完成,我不想看到所有操作都是由服务完成的,我想看看是哪个用户完成的。这不是更新的问题,因为我们有ModifiedBy将通过发送的UserId更新来更新的列。

问题是:有没有办法在SYSTEM_USER运行删除时设置或以其他方式将用户信息放入触发器中?

我现在拥有的“最佳”想法,虽然我不确定这是否是一个好主意,但在服务中,我检查当前UserId是否以用户身份存在于数据库中,如果没有,则创建一个用户为他们反对。然后运行存储过程EXECUTE AS User = @UserId。然后当 DML 在存储过程中完成并且触发器触发时,SYSTEM_USER应该从EXECUTE AS.

trigger sql-server audit azure-sql-database users

9
推荐指数
1
解决办法
8999
查看次数

将 RECORD 插入触发器函数中的表中

我想在触发器的表中插入一个 RECORD 数据类型变量(新变量)。SQL 会是什么样子?
以下尝试均未成功:

EXECUTE 'INSERT INTO my_table VALUES ' || NEW;
EXECUTE 'INSERT INTO my_table VALUES ' || NEW.*;
EXECUTE 'INSERT INTO my_table SELECT * FROM ' || NEW;
Run Code Online (Sandbox Code Playgroud)

postgresql trigger plpgsql update record

9
推荐指数
2
解决办法
6630
查看次数

从触发器调用多个函数?

我运行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万
查看次数