如何阻止错误的插入和更新到一个表?

时间:2011-01-13 17:40:22

标签: sql sql-server sql-server-2005

情况如下。我有一张像这样的桌子:

Col1 Col2 Col3 Col4 Col5 Col6
a    b    c     1   e     1
a    b    c     3   l     1
a    b    c     1   e     0
a    b    f     1   f     1

我的想法是我无法更新现有数据或添加新行 组合a b c 1? 1。 如果有的话,我必须阻止在最后一栏中添加1 已经是cols 1-3的一些组合,但我仍然可以 在col 6中添加0的相同组合。

2 个答案:

答案 0 :(得分:2)

对于更复杂的逻辑,使用触发器:触发器在指定时间触发(插入,更新,删除) - 之前(使用“for”)或之后触发。

您的示例 - 不允许插入给定的列组合的触发器:

create table MyTable (
    Col1 char, Col2 char, Col3 char, Col4 int, Col5 char, Col6 int
);

insert into MyTable (Col1, Col2, Col3, Col4, Col5, Col6)
values ('a', 'b', 'c', 1, 'e', '1');
insert into MyTable (Col1, Col2, Col3, Col4, Col5, Col6)
values ('a', 'b', 'f', 1, 'e', '1');

create trigger [dbo].[trigger_MyTable] on MyTable for insert as
begin
    if 0 < (select count(*) from inserted where 
        Col1='a' and Col2='b' and Col3='c' and Col4=1 and Col6=1)
    begin
        raiserror 50009 'wrong insert, no way!'
        rollback transaction
        return
    end
end;

-- now it fails
insert into MyTable (Col1, Col2, Col3, Col4, Col5, Col6)
values ('a', 'b', 'c', 1, 'e', '1');

当然,您可以创建更新触发器(使用“inserted”表)或删除(使用“已删除”表)。 您可以执行其他操作(例如在另一个表中插入另一行),...

也可以尝试使用MSDN:http://msdn.microsoft.com/en-us/library/ms189799(v=SQL.90).aspx

答案 1 :(得分:0)

除非我误解了你的要求,否则我认为你想要除col5之外的所有列都有一个独特的约束。

Alter Table Foo
ADD CONSTRAINT ak_orf UNIQUE 
(Col1, Col2 ,Col3 ,Col4 ,Col6),