我有MS SQL Server数据库并将一些值插入其中一个表。
假设该表包含ID
,int Status
和text Text
列。
如果可能的话,我想创建一个触发器,防止将特定的错误状态(例如1
)写入表中。相反,应该写0
。但是,插入新值时应保留其他列:
如果写的新行是(1, 4, "some text"
),则按原样写入
如果写入的新行是(1, 1, "another text"
),则写为(1, 0, "another text"
)
是否可以创建此类触发器?怎么样?
编辑:即使状态列无效,我也需要允许写入此类记录,因此外键对我不起作用。
答案 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以获取有关此选项的更多信息。