我是数据库的新手,我有一个关于带触发器或可能是检查约束的表的问题。我正在使用SQL Server Mangagement studio。
我有下表:
create table item(
startprice char(5) not null,
description char(22) not null,
start_date char(10) not null,
end_date char(10) not null,
indicator char(3) not null
);
我尝试制作的是此触发/约束规则:indicator
将获得" no"如果系统日期早于start_date
和end_date
,并且"是"如果系统日期在start_date
之后。
答案 0 :(得分:1)
这很简单,您必须使用带有before insert
选项的触发器 -
以下触发器适合在Oracle DB中使用 -
CREATE OR REPLACE TRIGGER item_insert_indicator
BEFORE DELETE ON item
For each row
begin
if :New.start_date > sysdate and :new.end_date > sysdate then
:New.indicator := 'no';
elsif :New.start_date < sysdate
:New.indicator := 'yes';
end if;
end;
这仅供您参考。您的数据库可以相应地更改关键字。
答案 1 :(得分:1)
如果indicator
仅通过插入进行评估,那么我建议您在新列created
中保存sysdate并将indicator
作为computed column:
ALTER TABLE item ADD created datetime not null default getdate()
ALTER TABLE item ADD indicator AS
case when created < start_date then 'no' else 'yes' end
PERSISTED
Trigger也是一个不错的选择:
CREATE TRIGGER item_indicator
ON item
FOR INSERT, UPDATE
AS
update inserted set indicator
= case when getdate() < start_date then 'no' else 'yes' end
GO
以及create new view(如果您在created
列中保留sysdate):
create view item2 as
select ...
, case when created < start_date then 'no' else 'yes' end as indicator
from item
如果您需要在indicator
上进行大量查询,那么在indicator
上使用持久计算列或触发器+添加索引会更好。
如果每次更新计算值,则触发器似乎最合适。
这些例子都没有在实际情况下进行测试:)