TL; DR:我真正的問題是在標題中,是否有可能在事務完成之前阻止表插入,也就是說只涉及數據,因爲在交易完成之前承諾?SQL:是否可以在事務完成之前阻止表插入?
UPDATE:什麼procedes僅僅是一個人爲的例子,可能不是一個好一個,表明我無法想出一個辦法來阻止前一個交易完成其中包含兩個語句的插入/更新。我只是想知道是否有辦法做到這一點,這個例子有點不相關。
(可能是壞的)例子:
我試圖阻止交易的,發生的,如果兩個表的某些屬性被打破了一個簡單的例子,讓我們說,我想阻止如果第一個表中的值(比如ID)已經存在於表2
create table dbo.tbl1
(
id int,
name varchar(20)
)
create table dbo.tbl2
(
id int,
name varchar(20)
)
go
,我想失敗的事情是:
begin transaction
insert into tbl1 values(1, 'tbl1_1')
insert into tbl2 values(1, 'tbl2_1')
commit transaction
由於在交易結束時,第一張表的ID將與表2中的值相同。
但是不幸的是我試過定義一個觸發器來阻止這個和檢查約束,阻止它。
觸發(as suggested here):
CREATE TRIGGER MyTrigger ON dbo.tbl1
AFTER INSERT, UPDATE
AS
if exists (select * from tbl2 inner join inserted i on i.id = tbl2.id)
begin
rollback
RAISERROR ('Duplicate Data', 16, 1);
end
檢查約束(as suggested here):
create function dbo.tbl2WithID(@ID int) returns int
as
begin
declare @ret int
select @ret = count(*) from tbl2 where id = @ID
return @ret
end
go
alter table dbo.tbl1
add constraint chk_notbl2withid
check (dbo.tbl2WithID(id) = 0)
go
我如何更新我的代碼,以成功地阻止交易?我是否需要將交易重新定義爲同一時間?
爲什麼不檢查傳入的值,而不是根本不插入,如果相同的值要插入到兩個表中? –
這是什麼數據庫?你的標籤遍佈整個地方。有什麼理由不能在'tbl1'上定義唯一的約束? – mustaccio
@ shree.pat18:我的目標是讓人們定義涉及這兩個表格的任何交易陳述,但要知道他們無法打破我強加的條件,請放心。就像我們定義約束一樣,每當我們想要更新表時,我們都不必記住那個邏輯。 – user420667