硬触发/约束制作

时间:2013-05-19 22:27:11

标签: sql sql-server

我是数据库的新手,我有一个关于带触发器或可能是检查约束的表的问题。我正在使用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_dateend_date,并且"是"如果系统日期在start_date之后。

2 个答案:

答案 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上使用持久计算列或触发器+添加索引会更好。

如果每次更新计算,则触发器似乎最合适。

这些例子都没有在实际情况下进行测试:)