标签: trigger

多个表的一个触发器

我在 PostgreSql 9.1 中有一个触发器,我想在插入多个表时触发它。是否可以让它影响所有这些表而不是为所有这些表创建触发器?我有 58 个表,我想使用调用触发器函数的同一个插入触发器,所以我一直在使用

create trigger tuweke 
after insert on product 
for each row execute procedure tuwekeAdjustextract(); 
create trigger tuweke 
after insert on caneweightment 
for each row execute procedure tuwekeAdjustextract(); 
...
Run Code Online (Sandbox Code Playgroud)

对所有这些表都这样做,然后我们有多个模式,所以工作量很大,这可以在一个查询中完成吗?然后影响该模式或整个数据库中的所有表?

postgresql trigger database-design postgresql-9.1

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

SQL Server:更新触发器在插入触发器之前触发

我有一个带有 SQL Server 托管数据库的应用程序。我无权访问应用程序代码,但我可以完全访问数据库。我已将自己的自定义审计添加到表中以帮助调试。

我正在使用after触发器。以下是我的触发器的简化版本。

问题:我看到update在相应insert审计记录之前的审计记录。这怎么可能?差异只有几毫秒,对于我目前的目的并不重要,但我可以想象更糟糕的情况,其中程序逻辑取决于正确的年表。

我知道在相同类型的触发器(全部insert或全部update)之间控制触发器执行顺序的方法。我可以对异构触发器执行顺序做出哪些假设?

create trigger dbo.MyTrigger_i on dbo.theTable
after insert
as
begin
    set nocount on
    declare @Date datetime, @User sysname
    set @Date = GETDATE()
    set @User = SUSER_SNAME()
    insert into MyAudit (RowID, [Date], UserName, Comment)
            select i.ID, @Date, @User, 'Insert'
            from 
                inserted as i
end
go

create trigger dbo.MyTrigger_u on dbo.theTable
after update
as
begin
    set nocount on
    declare @Date datetime, @User sysname
    set @Date …
Run Code Online (Sandbox Code Playgroud)

trigger sql-server-2008

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

在两个表中的触发器函数中选择

我在 x86_64-unknown-linux-gnu 上的 PostgreSQL 9.4.3 中的表和触发器,由 gcc (Debian 4.9.2-10) 4.9.2,64 位编译:

CREATE TABLE measurements (
        measurement_id SERIAL PRIMARY KEY NOT NULL,
        measurement_size_in_bytes INTEGER NOT NULL
    );    

CREATE TABLE file_headers (
        header_id SERIAL PRIMARY KEY NOT NULL, 
        measurement_id INTEGER NOT NULL, 
        file_header_index_start INTEGER,
        file_header_index_end INTEGER
    );

CREATE TRIGGER measurement_ids AFTER INSERT 
        ON measurements FOR EACH ROW 
        EXECUTE PROCEDURE ins_function('SELECT measurement_id FROM measurements 
        ORDER BY measurement_id desc limit 1;', 1, 666 ); 
Run Code Online (Sandbox Code Playgroud)

在那里我假设 SELECT 的数据类型自 SERIAL 以来是 INTEGER 但它显然是错误的,因为我从这个启动触发器的命令中收到错误消息:

INSERT INTO measurements …
Run Code Online (Sandbox Code Playgroud)

postgresql trigger datatypes plpgsql serialization

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

触发器问题的权限

我正在使用 MS-SQL 2008 R2 中的数据库,但遇到了问题。

基本设置是这样的: 有两个感兴趣的表:dbo.Assesments 和 audit.Assesments。dbo.Assesments 是工作数据表,并具有数据更改(插入、更新、删除)触发器以更新带有更改日志的 audit.Assesments。据我所知,这已经工作了多年,到目前为止一切顺利。

我们的 L2 支持有一个名为 SupportRole 的角色,他们通过 WinAuth 进入该角色,并且该角色具有一些存储过程的选择权限和执行权限。其中一个存储过程会更新 dbo.Assesments。这就是问题所在:更新进入,存储过程触发以将审计行插入到 audit.Assesments,然后他们立即得到“插入被拒绝,插入权限不足”,事务角色返回等。

这让我很困惑:我曾认为触发器更像是存储过程,如果它们被创建,他们有权做任何他们正在做的事情,但这让我三思而后行。我不想为审计表/模式的支持角色授予插入权限。我该怎么办?

schema trigger sql-server permissions sql-server-2008-r2

6
推荐指数
1
解决办法
9785
查看次数

如何在没有递归的情况下使用触发器更新同一行上的列?

SQL Server 2012。

每当我的表中的记录发生更改时,我都需要使用当前日期和时间更新列 [LastUpdated]。目前我有:

CREATE TRIGGER Trig_LastUpdated ON Contact AFTER UPDATE
AS
SET NOCOUNT ON

UPDATE ct
SET LastUpdated = GETDATE()
FROM Contact ct
INNER JOIN Inserted i
    ON ct.IDContact = i.IDContact
Run Code Online (Sandbox Code Playgroud)

但这是递归的,我不希望这样,会导致死锁和其他奇怪的事情。我无法全局关闭递归触发器。我看到 INSTEAD OF 触发器是非递归的,但是如果我这样做,我是否必须检查 Inserted 中的所有其他列以查看它是否已更新,或者 SQL Server 是否会为我处理?做到这一点的最佳方法是什么?

trigger sql-server deadlock sql-server-2012 row-modification-time

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

简化 SQL Server 触发器逻辑

我有一张Images表,该表包含这些基本列 —

ImageId (int)
VotesUp (int)
VotesDown (int)
Run Code Online (Sandbox Code Playgroud)

每张图片都可以得到赞成票(向上、向下、收回投票)

upvotes 表有:

ImageId (int)
UserId (int)
Score (int )   [-1,0,+1]
Run Code Online (Sandbox Code Playgroud)

因此,如果 -

  • 用户插入 +1 分数然后(如果不存在)我向upvotes表中添加一个新行并更新表中的值Images(用于快速获取)

  • 用户将其分数从 +1 更改为 0,然后降低 votes up

  • 用户将其分数从 +1 更改为 -1,然后减少votes up和增加 votes down
  • 用户将其分数从 0 更改为 +1,然后增加 votes up
  • 用户将其分数从 0 更改为 -1,然后增加 votes down

  • 用户将其分数从 -1 更改为 0 然后降低 votes down

  • 用户将其分数从 -1 更改为 +1,然后减少votes down 和增加votes up

这是一个非常简单的逻辑。

这是upvotes桌子上的触发器:

alter TRIGGER [dbo].[UpvotesChanged] …
Run Code Online (Sandbox Code Playgroud)

trigger sql-server sql-server-2008-r2

6
推荐指数
1
解决办法
136
查看次数

SQL Server:在未更改数据时捕获插入更新和删除的触发器?

我已将一个简单的表添加到名为:aaa_log 的数据库中,其中包含列 :( id, name, op))

CREATE TABLE aaa_log (
   [id] [int] IDENTITY(1,1) PRIMARY KEY NOT NULL,
   [name] [varchar](50) NOT NULL,
   [op] [varchar](50) NULL)
Run Code Online (Sandbox Code Playgroud)

id 列仅用于保持顺序的方式。

for insert, update, delete使用以下脚本向数据库中的所有其他表添加了触发器 ( ):

declare @cmd varchar(max)
declare trigger_create cursor for
select 'Create trigger ['+TABLE_SCHEMA+'].[xxtr_'+TABLE_NAME+'_auto]
  on ['+TABLE_SCHEMA+'].['+TABLE_NAME+'] fro insert,update,delete as
  BEGIN
   declare @op varchar(20)
   if exists(SELECT * from inserted)  and exists(SELECT * from deleted)
   begin
     set @op = ''update''
   end
   if exists(SELECT * from inserted)  and not …
Run Code Online (Sandbox Code Playgroud)

trigger sql-server

6
推荐指数
1
解决办法
7194
查看次数

在 json/jsonb 行上使用 IS DISTINCT FROM 触发而不进行比较逐项?

当表具有 json 或 jsonb 列时,是否无法在 INSERT/UPDATE 触发器中进行全行比较?我收到的错误让我认为我需要单独比较每一列,因为该NEW.*/OLD.*格式不能用于比较 json 列。

CREATE OR REPLACE FUNCTION on_insert_update_modified()
RETURNS TRIGGER AS $$
BEGIN
  IF row(NEW.*) IS DISTINCT FROM row(OLD.*) THEN
    NEW.modified_at = now();
    RETURN NEW;
  ELSE
    RETURN OLD;
  END IF;
END;
$$ language 'plpgsql';

CREATE TRIGGER mytable_insert_update
BEFORE INSERT OR UPDATE ON mytable
FOR EACH ROW
EXECUTE PROCEDURE on_insert_update_modified();
Run Code Online (Sandbox Code Playgroud)

当我插入包含 json 和 jsonb 列的表时,出现以下错误:

CREATE OR REPLACE FUNCTION on_insert_update_modified()
RETURNS TRIGGER AS $$
BEGIN
  IF row(NEW.*) IS DISTINCT FROM row(OLD.*) THEN
    NEW.modified_at …
Run Code Online (Sandbox Code Playgroud)

postgresql trigger plpgsql json postgresql-9.6

6
推荐指数
1
解决办法
2214
查看次数

基于另一列中的值的列约束

我有一个 PostgreSQL 表phase_steps,包含以下示例行:

phase_step_id|step_type|step_status|
-------------+---------+-----------+
            1| RESEARCH|           |
            2|   SURVEY|           |
        
Run Code Online (Sandbox Code Playgroud)

更新step_status列的值取决于该值 step_type是什么。
step_type为“RESEARCH”时,只能输入“COMPLETE”或“INCOMPLETE”值step_status
step_type为“SURVEY”时,只能输入“ASSIGNED”或“NOT ASSIGNED”值step_status

step_status我尝试通过以下过程管理“研究”约束:

create or replace function insert_step_status_value() returns trigger as $$
    begin
        if (new.step_status != 'COMPLETE') or (new.step_status != 'INCOMPLETE')
        from phase_steps where step_type = 'RESEARCH'
        then
            raise exception 'Status value not in range for this phase step';
        end if;
        return new;
    end;
$$ language plpgsql;

create trigger check_step_status_value before update …
Run Code Online (Sandbox Code Playgroud)

postgresql trigger database-design constraint check-constraints

6
推荐指数
1
解决办法
7905
查看次数

使两列双向唯一

我正在创建一个存储足球比赛的数据库。

每轮,任何特定的足球俱乐部只能踢一场比赛(主场或客场)。

例如,插入后

INSERT INTO Match (Round, Home, Away) VALUES (1, Barcelona, Real);

插入例如

INSERT INTO Match (Round, Home, Away) VALUES (1, Bayern, Barcelona);

INSERT INTO Match (Round, Home, Away) VALUES (1, Barcelona, Bayern);

必须被禁止,因为巴塞罗那已经在第一轮与皇马打了一场比赛。他们不应该能够在同一轮对阵拜仁(无论是主场还是客场)。

如何确保不会发生此类插入?

我使用触发器吗?某种唯一的索引组合?我两种都尝试过,但都迷路了,实际上并没有得到预期的结果。

谢谢

postgresql trigger index database-design constraint

6
推荐指数
1
解决办法
562
查看次数