如何不将特定值插入数据库

时间:2010-09-16 06:14:48

标签: sql sql-server

我有MS SQL Server数据库并将一些值插入其中一个表。

假设该表包含IDint Statustext Text列。

如果可能的话,我想创建一个触发器,防止将特定的错误状态(例如1)写入表中。相反,应该写0。但是,插入新值时应保留其他列:

如果写的新行是(1, 4, "some text"),则按原样写入 如果写入的新行是(1, 1, "another text"),则写为(1, 0, "another text"

是否可以创建此类触发器?怎么样?

编辑:即使状态列无效,我也需要允许写入此类记录,因此外键对我不起作用。

2 个答案:

答案 0 :(得分:2)

我认为即使你选择使用触发器,你也需要一个外键来确保数据的完整性(尽管我自己更喜欢'助手'存储过程 - 触发器可能导致调试地狱),例如

CREATE TABLE MyStuff 
(
 ID INTEGER NOT NULL UNIQUE,
 Status INTEGER NOT NULL 
    CHECK (Status IN (0, 1)), 
 UNIQUE (Status, ID) 
);

CREATE TABLE MyZeroStuff 
(
 ID INTEGER NOT NULL, 
 Status INTEGER NOT NULL 
    CHECK (Status = 0), 
 FOREIGN KEY (Status, ID)
    REFERENCES MyStuff (Status, ID), 
 my_text VARCHAR(20) NOT NULL
);

CREATE TRIGGER tr__MyZeroStuff
ON MyZeroStuff
INSTEAD OF INSERT, UPDATE
AS
BEGIN; 
INSERT INTO MyZeroStuff (ID, Status, my_text)
SELECT i.ID, 0, i.my_text
  FROM inserted AS i;
END; 

答案 1 :(得分:0)

已经提到了一个插入触发器,但实现此目的的另一种方法是在Status列上有一个foriegn键,它指向Status表 - 这将不允许写入和更改值,而是简单地禁止如果foriegn密钥无效,则写入。

查看referential integrity以获取有关此选项的更多信息。