我在这里看了很多关于这种触发器的文章和问题,但似乎无法找到确切的答案。
希望它很快,或者我很傻......
我有这个:
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.
我的问题是,我哪里出错了? - 名字和areaid不要,存在于我正在尝试的插入中但是我被阻止了,我在那里做了一些后退吗?
非常感谢任何帮助!
编辑:
这是我的插入内容:
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
答案 0 :(得分:3)
您不必使用触发器来保证不同的行。您可以通过在表格的两列上设置unique constraint来实现此目的:
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
消息:
Ms 2627,Level 14,State 1,Line 17
违反UNIQUE KEY约束'uq_JobCategories'。无法在对象'dbo.JobCategories'中插入重复键。重复键值为(test1,1)。声明已经终止。
答案 1 :(得分:1)
记录在执行触发器功能时已经存在。
您可以使用INSTEAD OF
- 触发器来替换INSERT语句的标准操作。
但是有更好的方法可以确保不会插入重复项。
(首先是unique constraints,就像在@ RigertaDemiri的答案中已经提到的那样。)