2015-09-13 56 views
0

我創建了觸發器check_id。 具有觸發我希望的情況下,當我做User一個插入與Id = 4這樣就User回滾一個Insert聲明的User.Id = 4回滾觸發器

但是:

INSERT INTO USER (Id, Name) 
VALUES (4, 'Emmanuel') 

我得到一個錯誤:

Rollback not available in an atomic process

我該怎麼做?如何在觸發器中回滾INSERT?

+0

是,所有的代碼?無法重現看到[SqlFiddle](http://sqlfiddle.com/#!6/49123/1/0),當取消註釋時你會得到'「事務在觸發器中結束,批處理已被中止。作爲關鍵字是非常糟糕的做法 – lad2025

+3

你的觸發器**主要**缺陷,你似乎認爲它會被稱爲**每行**一次 - 這是**不是**的情況。觸發器將在每個語句**中觸發一次**,因此如果您的INSERT語句影響25行,您將觸發**一次**,但是「插入」將包含25行。您的代碼在這25行中選擇哪一個? '從插入的SELECT ID' - 它是非確定性的,你得到*一個arbtitrary *行,並且所有其他24個被**忽略**。你需要重寫你的觸發器來考慮這個問題! –

+0

秒作爲marc_s建議它不會與多行的工作見INSERT INTO [用戶](Id,Name)VALUES(4,'Emmanuel'),(5,'AAA');' – lad2025

回答

3

使用檢查約束來代替:

SqlFiddle

ALTER TABLE [user] ADD CONSTRAINT chk_user CHECK (id <> 4);