标签: 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万
查看次数

获取身份值以在 INSTEAD OF 触发器中用作 FK

我有一系列可更新的视图,我们向最终用户公开作为后端流程的界面。

其中一个视图引用了两个表,并且需要一个INSTEAD OFforUPDATEINSERTs的触发器。

表的结构是(大大简化):

Claim
(DataRowID bigint IDENTITY PRIMARY KEY
,<bunch of claim data>)

ClaimExtended
(ClaimDataRowID bigint FOREIGN KEY references dbo.Claim(DataRowID) NOT NULL
,<bunch of other claim data>)
Run Code Online (Sandbox Code Playgroud)

我最初的计划是在触发器中这样做:

CREATE TRIGGER [dbo].[MyTrigger] ON [dbo].[MyView]
INSTEAD OF INSERT
AS

DECLARE @IDLink TABLE
    (RowID int
    ,ClaimDataRowID bigint)

DECLARE @Inserted TABLE
    (RowID int identity (1,1) NOT NULL
    ,<all the columns from the view>)

INSERT INTO
    @Inserted
    (<View columns>)
SELECT
    (<View columns>)
FROM
    Inserted

INSERT INTO
    Claim
    (<Columns>) …
Run Code Online (Sandbox Code Playgroud)

trigger sql-server sql-server-2008-r2 identity output-clause

7
推荐指数
1
解决办法
2205
查看次数

触发器 - 在动态 SQL 中使用插入/删除的表

在触发器中,我试图创建一个唯一的表名(使用NEWID()),我可以存储在插入和删除的表中找到的数据。

Declare @NewID varchar(50) = Replace(convert(Varchar(50),NEWID()),'-','')
Declare @SQLStr varchar(8000)
Set @SQLStr= 'Select * into [TMPIns' + @newID + '] from inserted'
Exec (@SQLStr)
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:无效的对象名称“插入”

我知道我可以做到:

Select * into #inserted from inserted
Set @SQLStr= 'Select * into [TMPIns' + @newID + '] from #inserted'
Exec (@SQLStr)
Run Code Online (Sandbox Code Playgroud)

但是我不想使用 TempDB,因为这些表会变得很大,而且我也觉得它是多余的。有没有办法避免创建#inserted?

trigger sql-server dynamic-sql sql-clr

7
推荐指数
1
解决办法
5760
查看次数

这个触发器的目的是什么?

我在尝试分析一些数据库时偶然发现了这个触发器:

Create trigger [tbl_Details_Trigger] on [tbl_Details]
    Instead of Insert
    As
      Insert into [tbl_Details]
      Select * from inserted
Run Code Online (Sandbox Code Playgroud)

在我看来,这个触发器并没有做任何特别的事情,如果它被丢弃,结果将是一样的。我对吗?我错过了什么吗?

trigger sql-server

7
推荐指数
1
解决办法
68
查看次数

更新列的 T-SQL 触发器

我已经使用 SQL 查询几个星期了,我正在尝试从错误中学习和理解。我有两列的表IsInvisible (bit)ShortName (string)当一个被改变为更新的另一个也如: -如果添加〜于SHORTNAME到组的前面IsInvisible为1,并且如果〜被去除,以将其设置为0 -如果IsInvisible被设置为1 在 ShortName 前面添加 ~ 并在设置为 0 时将其删除。

我试过这样的事情:

ALTER TRIGGER [dbo].[updateInvisibility]
ON [dbo].[table]
AFTER UPDATE
AS
BEGIN

UPDATE t
SET IsInvisible = (CASE WHEN i.ShortName like '~%' THEN 1 ELSE 0 END),
    ShortName = (CASE WHEN i.IsInvisible = 1 AND t.ShortName NOT LIKE '~%'
                 THEN '~' + t.ShortName
                 ELSE t.ShortName
            END)
FROM table t JOIN
     inserted i
     ON t.Id = i.Id;

end
Run Code Online (Sandbox Code Playgroud)

我的问题是,当我更新其中一列或同时更新两列时,没有任何反应,并且出现此错误:

Maximum stored …
Run Code Online (Sandbox Code Playgroud)

trigger sql-server t-sql

7
推荐指数
1
解决办法
716
查看次数

有时更新的行没有被锁定而不是更新触发器

这是一个小的repro:

create table dbo.t (id int primary key, v int);
insert into dbo.t values (1, 1), (2, 2);

create table dbo.s (id int primary key, v int);
insert into dbo.s values (1, 10);
go

create trigger dbo.tr_t__iou
on dbo.t
instead of update
as
begin
 set nocount on;

 exec sp_lock @@spid;
end;
go

update dbo.t set v = 10 where id = 1;

update t
 set
  v = 10
from
 dbo.s s join
 dbo.t t on t.id = s.id;

update t …
Run Code Online (Sandbox Code Playgroud)

trigger sql-server t-sql locking

7
推荐指数
1
解决办法
266
查看次数

分区表和性能上的触发器

我不确定我发现的是否是一个错误,但它看起来确实是这样。我找不到太多有关它的信息,所以我决定把它放在这里。

因此,简而言之,在访问内部表(inserteddeleted分区表上定义的触发器中的

为了测试这个问题,我创建了一些简单的表,它们完全相同,但一个是分区的,另一个不是:

create table [dbo].[Test1](
    [part_id] [int] not null,
    [id] [int] not null,
    [cost] [float] null,
    constraint [pk__Test1] primary key clustered ([part_id] asc, [id] asc) on ps_part(part_id)
);

create table [dbo].[Test2](
    [part_id] [int] not null,
    [id] [int] not null,
    [cost] [float] null,
    constraint [pk__Test1] primary key clustered ([part_id] asc, [id] asc)
);
Run Code Online (Sandbox Code Playgroud)

然后我用一些数据填充了表格。我现在没有数据生成脚本,我只是使用了一些本地数据,但是这些表中有大约 473 个不同的分区和大约 383M 行。

然后我刚刚测试了这些表的更新速度,使用非常简单的查询,例如

update dbo.Test1 set cost = cost + 0.1 where part_id = ??;
update dbo.Test1 set cost = …
Run Code Online (Sandbox Code Playgroud)

trigger performance sql-server partitioning sql-server-2016

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