Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如果存在,则插入触发器_Sql Server_Tsql_Sql Insert_Database Trigger - Fatal编程技术网

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是否已经存在。。。。。对缺乏信息表示歉意我只是偏离了最初得到的信息。。