2013-05-20 35 views
0

我是一名数据库初学者,我有这个困难的拍卖数据库项目。 我也使用SQL Server Management Studio。带触发器的初学者

create table user(
name char(10) not null, 
lastname char(10) not null 
) 

create table item(
buyer varchar(10) null, 
seller varchar(10) not null, 
startprice numeric(5) not null, 
description char(22) not null, 
start_date datetime not null, 
end_date datetime not null, 
seller char(10) not null, 
item_nummer numeric(9) not null, 
constraint fk_user foreign key (buyer) references user (name) 
) 

基本上什么规则IM试图在这里提出的是: 列买方NULL,除非时间(开始日期和结束日期)结束,startprice didnt涨还是会增加。然后专栏买家将从在该商品上竞标的表格用户处获得名称。

规则是出价太难为我做的,我想做出一个触发器,但林不知道..

回答

0

在解决您的问题之前,您的模式需要解决一些初始问题。下面是改变我会做出显著缓解答案的实现:

-- Added brackets around User b/c "user" is a reserved keyword 
-- Added INT Identity PK to [User] 


CREATE TABLE [user] 
    (
     UserId INT NOT NULL 
       IDENTITY 
       PRIMARY KEY 
    , name CHAR(10) NOT NULL 
    , lastname CHAR(10) NOT NULL 
    ) 

    /*  changed item_nummer (I'm not sure what a nummer is...) to ItemId int not null identity primary key 
    Removed duplicate Seller columns and buyer column 
    Replaced buyer/seller columns with FK references to [User].UserId 
    Add currentBid to capture current bid 
    Added CurrentHighBidderId 
    Added WinningBidderId as computed column 
    */ 

CREATE TABLE item 
    (
     ItemId INT NOT NULL 
       IDENTITY 
       PRIMARY KEY 
    , SellerId INT NOT NULL 
        FOREIGN KEY REFERENCES [User] (UserId) 
    , CurrentHighBidderId INT NULL 
           FOREIGN KEY REFERENCES [User] (UserId) 
    , CurrentBid MONEY NOT NULL 
    , StartPrice NUMERIC(5) NOT NULL 
    , Description CHAR(22) NOT NULL 
    , StartDate DATETIME NOT NULL 
    , EndDate DATETIME NOT NULL 
    ) 
    go 


ALTER TABLE dbo.item ADD 
WinningBidderId AS CASE WHEN EndDate < CURRENT_TIMESTAMP 
AND currentBid > StartPrice THEN CurrentHighBidderId ELSE NULL END 
GO 

随着其他列计算列可以返回正确的信息。如果您要必须返回赢家的名称而不是id,那么您可以保持架构高于相同,添加一个额外的列来存储用户的名称,用触发器填充它,并保持计算列有条件地显示/不显示赢家......

3

您的模型不正确。首先,您需要一张表来存储出价。然后当拍卖结束时,您将最高价格更新为中标。最好的办法是每分钟运行一次工作,并找到任何新近结束的拍卖的获胜者。

由于触发器仅在插入/更新或删除时触发,因此触发器无法在您拥有的两个表上工作。它不会因为时间过去而开火。进一步触发器是一种先进的技术,数据库初学者应该避免使用它们,因为你可以使用严重的触发器进行可怕的破坏。

您可以在插入到出价表时使用触发器,将出价更新为胜出者,并将该状态从前一赢家处取走。然后,您只需在拍卖结束时停止接受新的出价。如果拍卖是开放的,您的应用程序可以显示标记为获胜者的竞标者,如果竞标者被关闭,则可以显示赢家。

+0

这也可能会采取数据库解决方案。 OPs的设计看起来像是一个UI操作的倒退 –