Sql server 如果存在,则插入触发器
我已经阅读了很多关于这类触发器的文章和问题,但似乎找不到确切的答案 希望这是一个非常快的一个,或者我是愚蠢的 我有这个:Sql server 如果存在,则插入触发器,sql-server,tsql,sql-insert,database-trigger,Sql Server,Tsql,Sql Insert,Database Trigger,我已经阅读了很多关于这类触发器的文章和问题,但似乎找不到确切的答案 希望这是一个非常快的一个,或者我是愚蠢的 我有这个: ALTER TRIGGER [dbo].[JobCategoriesInsertTrigger] ON [dbo].[JobCategories] FOR INSERT AS IF EXISTS(SELECT [name], [areaId] FROM JobCategories WHERE [name] = (SELECT [name] FROM inserted)
ALTER TRIGGER [dbo].[JobCategoriesInsertTrigger]
ON [dbo].[JobCategories]
FOR INSERT
AS
IF EXISTS(SELECT [name], [areaId] FROM JobCategories WHERE [name] = (SELECT [name] FROM inserted) AND [areaId] = (SELECT [areaid] FROM inserted))
BEGIN
RAISERROR('THIS RECORD ALREADY EXISTS', 10, 1)
PRINT 'The record you are trying to insert already exists'
ROLLBACK
END
尝试不存在的插入时,我会得到以下结果:
THIS RECORD ALREADY EXISTS
The record you are trying to insert already exists
Msg 3609, Level 16, State 1, Line 4
The transaction ended in the trigger. The batch has been aborted.
我的问题是,我哪里出错了名称和区域ID不存在于我正在尝试的插入中,但我被阻止了,我是否在那里做了一些向后的操作
任何帮助都将不胜感激
编辑:
这是我的插页:
INSERT INTO [dbo].[JobCategories]
([id]
,[name]
,[description]
,[areaId]
,[enabled])
VALUES
(NEWID(),
'test01',
'testitem',
'2C6F2293-2BBD-4E54-9709-FB9C4C0200F55',
1)
GO
表中已有的数据示例:
id name description areaId
D120B34D-8074-4EA1-A52D-9477C3A9DFAF 500 STAT12 EXCEPTION 954A8859-311A-4F86-80CD-4E6DC4E5103E
4B737203-6E6D-435B-9BAD-95C3B28DCCB1 501 STATIC EXCEPTION 954A8859-311A-4F86-80CD-4E6DC4E5103E
A653FADC-996B-4E6F-80F4-5C08202228E2 551 EXCEPTION 70 954A8859-311A-4F86-80CD-4E6DC4E5103E
在执行触发器功能时,记录已存在。
可以使用-Trigger替换INSERT语句的标准操作 但是有更好的方法来确保不插入重复项。
(首先,就像@RigertaDemiri的回答中已经提到的那样。)在执行触发器功能时,记录已经存在。
可以使用-Trigger替换INSERT语句的标准操作 但是有更好的方法来确保不插入重复项。
(首先,就像@RigertaDemiri的回答中已经提到的那样。)您不必使用触发器来保证不同的行。您可以通过在表的两列上设置一个
CREATE TABLE [JobCategories]
(
id INT IDENTITY(1,1),
name VARCHAR(10),
areaid INT
)
ALTER TABLE dbo.JobCategories
ADD CONSTRAINT uq_JobCategories UNIQUE(name, areaid);
INSERT INTO [JobCategories] (name, areaid)
VALUES ('test1', 1), -- will work
('test1', 2) -- will also work
SELECT * FROM [JobCategories]
现在,尝试插入已经存在的内容:
INSERT INTO [JobCategories] (name, areaid)
VALUES ('test1', 1) -- will fail
信息:
Msg 2627,第14级,状态1,第17行违反唯一密钥约束“uq_JobCategories”。无法在对象“dbo.JobCategories”中插入重复键。重复的键值为(test1,1)。声明已终止
是一个非常好的读物。您不必使用触发器来保证不同的行。您可以通过在表的两列上设置一个
CREATE TABLE [JobCategories]
(
id INT IDENTITY(1,1),
name VARCHAR(10),
areaid INT
)
ALTER TABLE dbo.JobCategories
ADD CONSTRAINT uq_JobCategories UNIQUE(name, areaid);
INSERT INTO [JobCategories] (name, areaid)
VALUES ('test1', 1), -- will work
('test1', 2) -- will also work
SELECT * FROM [JobCategories]
现在,尝试插入已经存在的内容:
INSERT INTO [JobCategories] (name, areaid)
VALUES ('test1', 1) -- will fail
信息:
Msg 2627,第14级,状态1,第17行违反唯一密钥约束“uq_JobCategories”。无法在对象“dbo.JobCategories”中插入重复键。重复的键值为(test1,1)。声明已终止
是一个非常好的读物。我认为名称和区域ID已经存在,这是导致此错误的原因。请提供一些样本数据供我们测试,以便我们可以重新处理您面临的相同问题。如果insert中有多个值,会发生什么情况??您的exist可能无法在您编写的AFTER INSERT触发器的场景中工作。您将在记录完成插入后检查该记录是否存在。记录当然存在。我要插入的数据不存在,只有这两列需要与软件验证数据的方式进行比较—a而不是INSERT help吗?您的主要问题是,您假设触发器在
Inserted
伪表中只有一行—事实并非如此!如果一次插入5行,Inserted
包含这5行,然后选择SELECT[name]FROM Inserted
将选择这五个名称中的哪一个,以及这五个区域ID中的哪一个??这是行不通的。每个语句触发一次触发器-因此您必须准备好处理插入的中的多行
我认为名称和区域ID已经存在,这就是导致此错误的原因。请提供一些示例数据供我们测试,因此,我们可以重新处理您面临的相同问题。如果insert中有多个值,会发生什么情况??您的exist可能无法在您编写的AFTER INSERT触发器的场景中工作。您将在记录完成插入后检查该记录是否存在。记录当然存在。我要插入的数据不存在,只有这两列需要与软件验证数据的方式进行比较—a而不是INSERT help吗?您的主要问题是,您假设触发器在Inserted
伪表中只有一行—事实并非如此!如果一次插入5行,Inserted
包含这5行,然后选择SELECT[name]FROM Inserted
将选择这五个名称中的哪一个,以及这五个区域ID中的哪一个??这是行不通的。每个语句触发一次触发器-因此您必须准备好处理插入的中的多行
谢谢-起初我认为这会起作用,但我已经与我们的软件开发人员进行了双重检查,他们声明可以共享相同的“areaId”但在插入新类别时,必须检查名称和区域ID是否不存在。。。。。对于缺乏信息表示歉意,我只是偏离了最初得到的信息。谢谢-我本来以为这会起作用,但我已经与我们的软件开发人员进行了双重检查,他们表示,东西可以共享相同的“areaId”,但在插入新类别时,必须检查名称和areaId是否已经存在。。。。。对缺乏信息表示歉意我只是偏离了最初得到的信息。。