我想创建一个触发器,以防止在numflights不存在的航班 ( )的预订表中插入。
Tables
----------------------------------------------
flights(numflight, origine, destination, dep, arr)
airports(code, city, country)
reservation(people, numflight, date_travel)
Run Code Online (Sandbox Code Playgroud)
列origine和destination包含机场代码。
我想询问您对在网站中使用 MySQL 触发器或事务的意见。
实际上我有一个payment带有 -的历史表UserId | OperationId | Comment | Credits | Sign (debit or credit)。所以每个支付操作都插入到这个表中。
但是,每次用户每次操作时,计算其总信用额度将是耗时的。所以我认为将每个用户的总信用金额保留在用户profile表中可能是一个好主意。
这是问题所在。我如何确保表中的总信用金额profile将与payment历史表中的操作保持同步?
我想使用两种方法:
哪个更靠谱?如果我有大型数据库(超过 100.000 个用户)怎么办?
你有什么建议来做到这一点吗?
BD MySQL 引擎是 InnoDB。
我有一个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)
这种设置是明智的,还是在性能方面有更好的方法?
当我插入表使用INSTEAD OF触发器,@@Identity,IDENT_CURRENT('Table')并SCOPE_IDENTITY()返回null。如何获取插入行的最后一个标识?
我有一系列可更新的视图,我们向最终用户公开作为后端流程的界面。
其中一个视图引用了两个表,并且需要一个INSTEAD OFforUPDATE和INSERTs的触发器。
表的结构是(大大简化):
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
在触发器中,我试图创建一个唯一的表名(使用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?
我在尝试分析一些数据库时偶然发现了这个触发器:
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)
在我看来,这个触发器并没有做任何特别的事情,如果它被丢弃,结果将是一样的。我对吗?我错过了什么吗?
我已经使用 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) 这是一个小的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) 我不确定我发现的是否是一个错误,但它看起来确实是这样。我找不到太多有关它的信息,所以我决定把它放在这里。
因此,简而言之,在访问内部表(inserted和deleted分区表上定义的触发器中的
为了测试这个问题,我创建了一些简单的表,它们完全相同,但一个是分区的,另一个不是:
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 ×10
sql-server ×8
t-sql ×3
identity ×2
mysql ×2
performance ×2
dynamic-sql ×1
innodb ×1
locking ×1
partitioning ×1
sql-clr ×1
transaction ×1