标签: database-trigger

修改MySQL触发器

我有一个要修改的MySQL触发器。唯一的变化是在触发器主体中。

是否足以更新ACTION_STATEMENTColumn INFORMATION_SCHEMA.TRIGGERS?这是更新触发器的正确​​方法吗?具体来说,我正在寻找这样做可能引起的任何问题。

mysql sql triggers database-trigger

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

检查触发器是否存在

我对公共模式中所有表的触发器有以下查询:

SELECT 'CREATE TRIGGER ' || tab_name|| '_if_modified_trg INSERT OR UPDATE OR DELETE ON  ' || tab_name|| ' FOR EACH ROW EXECUTE PROCEDURE audit.if_modified_func(); ' AS trigger_creation_query
FROM (
   SELECT quote_ident(table_schema) || '.' || quote_ident(table_name) as  tab_name
   FROM information_schema.tables
   WHERE table_schema='public'
   ) AS foo;
Run Code Online (Sandbox Code Playgroud)

我知道如何检查触发器是否存在:

SELECT tgname
from pg_trigger
where not tgisinternal AND tgname='randomname'
Run Code Online (Sandbox Code Playgroud)

但是,如何在第一个查询中检查同名触发器是否已存在 - 并跳过创建它并继续?这是我的解决方案,但它不起作用:

SELECT 'CREATE TRIGGER ' || tab_name|| '_if_modified_trg INSERT OR UPDATE OR DELETE ON  ' || tab_name|| ' FOR EACH ROW EXECUTE PROCEDURE audit.if_modified_func(); …
Run Code Online (Sandbox Code Playgroud)

postgresql dynamic-sql plpgsql database-trigger

5
推荐指数
2
解决办法
7628
查看次数

触发器:插入的表是如何工作的?如何访问它的行?

我有下表

Data --Table name
ID -- Identity column
PCode -- Postal Code
Run Code Online (Sandbox Code Playgroud)

我创建了以下触发器:

CREATE TRIGGER Trig
ON Data
FOR INSERT
AS
BEGIN 

    Select * from inserted

END
Run Code Online (Sandbox Code Playgroud)

并插入以下值

INSERT INTO Data VALUES (125)
INSERT INTO Data VALUES (126)
INSERT INTO Data VALUES (127)
Run Code Online (Sandbox Code Playgroud)

它显示了这一点:

在此处输入图片说明

但我期待这样的事情:

  • 第一次插入后,执行触发器 ->inserted表中显示一行。
  • 第 2 次插入后,执行触发器 ->inserted表中显示两行。
  • 第 3 次插入后,执行触发器 ->inserted表中显示三行。

根据msdn.microsoft插入的所有行都在此表中。


如何访问inserted表格以便我可以看到所有预期的行而不是单独看到?

sql t-sql sql-server database-trigger

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

当列在另一个触发器中更改时,ORACLE“更新前”触发器不会触发

我正在使用 ORACLE 12c。

在一张桌子上,我有 2 个触发器,都是“更新前”。更新列时触发其中一个触发器,并且在此触发器中另一列获得新值。第二个触发器应该在更新第二列时触发。但他没有。

create table TRIGGER_TEST
(
    col1 varchar2(64),
    col2 varchar2(64),
    col3 varchar2(64)
);

create or replace trigger TR_TRIGGER_TEST_1 
before update of COL1 on TRIGGER_TEST
for each row
begin
    dbms_output.put_line('here we are in TR_TRIGGER_TEST_1');
    :new.col2 := 'only testing';
end;
/

create or replace trigger TR_TRIGGER_TEST_2
before update of COL2 on TRIGGER_TEST
for each row
begin
    dbms_output.put_line('here we are in TR_TRIGGER_TEST_2');
    :new.col3 := 'trigger_test_2 has fired';
end;
/


insert into TRIGGER_TEST values ('1_col1','1_col2','1_col3');
select * from TRIGGER_TEST;

COL1 …
Run Code Online (Sandbox Code Playgroud)

oracle plsql database-trigger

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

错误:列“semester_id”是整数类型,但表达式是布尔类型

我在 PostgreSQL 中创建了这个 PL/pgSQL 触发器函数:

CREATE or replace FUNCTION public.trigger31()
        RETURNS trigger
        LANGUAGE 'plpgsql'
        COST 100
        VOLATILE NOT LEAKPROOF 
    AS $BODY$
    begin
        if(TG_OP='INSERT') then
            if(New.start_date>(select max(end_date) from "Semester") and New.end_date>New.start_date) then

                Insert Into "Semester" (semester_id,academic_year,academic_season,start_date,end_date,semester_status)
                values (New.semester_id=(select max(s.semester_id)+1 from "Semester" s):: integer,
                        new.academic_year= academic_year_trig(),
                        new.academic_season=academic_season_trig(),
                        new.start_date,new.end_date,
                        new.semester_status=semester_stat_trig()
                    );
                return NEW;
            else
                RAISE EXCEPTION 'Invalid start_date or end_date';
            end if;
        end if;
    end;
$BODY$;
Run Code Online (Sandbox Code Playgroud)

尝试执行它,我收到此错误:

ERROR:  column "semester_id" is of type integer but expression is of type boolean
LINE 2:    values …
Run Code Online (Sandbox Code Playgroud)

postgresql plpgsql auto-increment database-trigger sql-insert

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

输出子句 VS 触发器

在我们的数据库中,大多数表都有一个dbupddate字段指示datetime最后一个INSERTUPDATE应用于该行。

为了避免该字段具有错误的值,存在触发器(有时AFTER,有时INSTEAD OF)来确保最终该值是正确的,而不是有人尝试写入该字段的任何“手动”其他值。

现在我正在执行更新语句(实际上MERGE),并且我想要一个OUTPUT包含该字段的子句。正如我在相应的 MS 文章中读到的,OUTPUT忽略触发器。

是否有任何解决方法可以返回触发器后的OUTPUT值?dbupddate我不想进行另一个查询来绘制信息,因为我不能保证在这些查询之间的瞬间,另一个用户的第三个查询可能不会改变所有内容。


遵循 Larnu 的建议后的结果

我运行了提供的示例,唯一的例外是将字段default的值更改updatetime为,convert(datetime2,'1900-01-01')以便我可能有意义。我运行了 4 个查询中的每一个,然后从各自的表中进行选择并比较了值updatetime

INSERT INTO dbo.Sample1 (Someint)
OUTPUT inserted.*
INTO @inserted
SELECT 1;

SELECT 'Sample1 INSERT',*
FROM @inserted; -- 1900-01-01 00:00:00.000000
select * from Sample1  -- 2018-11-05 13:12:13.141580
Run Code Online (Sandbox Code Playgroud)

我猜这里的输出会忽略触发器并返回after触发器生效之前插入的默认值。

DECLARE @inserted table (ID int, Someint int, …
Run Code Online (Sandbox Code Playgroud)

sql t-sql sql-server output-clause database-trigger

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

插入触发器之前替换新数据 postgres

我有一个包含两个数据列的表:col1 和 col2。Col1 是文本字段,col2 是时间。Col1 是必需的,col2 不是,因此它的默认值应该为 null。我使用 pgAdmin,它对我来说是全新的,就像 sql 触发器一样。我有以下触发功能代码:

CREATE OR REPLACE FUNCTION schema.table_replace()
  RETURNS trigger AS
  LANGUAGE 'plpgsql';
$BODY$
BEGIN
    (CASE
        WHEN NEW.col1='111' THEN NEW.col1='aaa'
        WHEN NEW.col1='222' THEN NEW.col1='bbb'
        WHEN NEW.col1='333' THEN NEW.col1='ccc'
        ELSE NEW.col1='error'
    END);
return NEW;
END;
$BODY$
Run Code Online (Sandbox Code Playgroud)

这可能是之前的触发器(只有当前值应该受到影响,而不是所有行):

CREATE TRIGGER schema.table_replace
  BEFORE INSERT
  ON schema.table
  EXECUTE PROCEDURE schema.table_replace();
Run Code Online (Sandbox Code Playgroud)

说实话,我对pgAdmin一无所知,它似乎比编写代码并使用查询工具运行要复杂得多。问题是处理没有第二个值(它是可选的)的情况,在这种情况下,该行的 col2 应该保持不变,并且 SQL 代码也会返回错误。您能否提供一些帮助以使其运行并创建函数和触发器?谢谢。

postgresql plpgsql database-trigger

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

触发器中的多个过程调用?

我想从 postgres 中的触发器调用多个过程。

CREATE TRIGGER fn_trigger_notify_ev
AFTER INSERT
ON public.event_notifications
FOR EACH ROW
EXECUTE PROCEDURE public.notify_events();
EXECUTE PROCEDURE public.notify_events_count();
Run Code Online (Sandbox Code Playgroud)

执行此命令后,我一直收到错误消息,所以请告诉我,是否可以在触发器中调用多个过程?

错误信息:

ERROR:  syntax error at or near "public"
LINE 6:   EXECUTE PROCEDURE public.notify_events_count();
                        ^

********** Error **********

ERROR: syntax error at or near "public"
SQL state: 42601
Character: 167
Run Code Online (Sandbox Code Playgroud)

有没有什么方法可以调用多个过程?

postgresql triggers database-trigger

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

Use a Postgres trigger to record the JSON of only the modified fields

Is there a way to get the JSON of the only modified fields?

Now I use the following trigger but the entire line is printed in the changelog.

Example tables:

TABLE tbl_changelog (
  tbl    TEXT,
  op   TEXT,
  new     JSON,
  old     JSON
);

TABLE tbl_items (
  f1    TEXT,
  f2    TEXT
);
Run Code Online (Sandbox Code Playgroud)

Trigger:

CREATE OR REPLACE FUNCTION changelog_procedure() RETURNS trigger AS $$
BEGIN
INSERT INTO tbl_changelog(tbl, op, new, old)
VALUES (TG_TABLE_NAME, TG_OP, row_to_json(NEW), row_to_json(OLD));
RETURN NULL;
END;
$$ LANGUAGE plpgsql SECURITY DEFINER; …
Run Code Online (Sandbox Code Playgroud)

postgresql json plpgsql database-trigger jsonb

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

在 PostgreSQL 视图的触发器中使用 DEFAULT 处理 NULL 值吗?

我想解释一下 Postgres 视图的触发器。

为了弄清楚我想问什么,我会给你一个非常简单的例子。在本例中,我们有两个表 ( table_a, table_b) 连接在一起构成了示例中的视图 ( vw_table_ab)。

在本例中,我将使用简单的名称和简单的 DDL/DML。

-- TABLE table_a
CREATE TABLE table_a
(
    id              serial PRIMARY KEY,
    timestamp_field timestamp DEFAULT now() NOT NULL,
    boolean_field   boolean   DEFAULT FALSE NOT NULL
);

-- TABLE table_b
CREATE TABLE table_b
(
    id              serial PRIMARY KEY,
    timestamp_field timestamp DEFAULT now() NOT NULL,
    boolean_field   boolean   DEFAULT FALSE NOT NULL,
    id_table_a      integer                 NOT NULL,
    CONSTRAINT "fk_table_a" FOREIGN KEY (id_table_a) REFERENCES table_a (id) ON DELETE CASCADE NOT DEFERRABLE,
    CONSTRAINT …
Run Code Online (Sandbox Code Playgroud)

postgresql plpgsql database-trigger postgresql-9.3

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