有触发器的初学者

时间:2013-05-20 20:33:54

标签: sql sql-server

我是数据库的初学者,我得到了这个困难的拍卖数据库项目。 我也在使用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)
)

基本上我试图在这里制定的规则是: 除非时间(start_date和end_date)结束且startprice没有上升或增加,否则列买方为NULL。然后,列买方将从投标该项目的表格用户获取该名称。

这条规则对我来说太难了,我想要触发,但我不确定..

2 个答案:

答案 0 :(得分:3)

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

触发器不会对您拥有的两个表有效,因为触发器仅在插入/更新或删除时触发。它不会因为时间过去而开火。进一步的触发器是一种先进的技术,db初学者应该避免使用它们,因为你可以通过编写错误的触发器来进行可怕的破坏。

您可以设置一个触发器,可以插入到出价表中,该触发器会将出价更新为获胜者,并使该状态远离之前的获胜者。然后,您只需在拍卖结束时停止接受新的出价。如果拍卖是开放式的,您的应用程序可以显示标记为获胜者的投标人,如果关闭,则显示获胜者。

答案 1 :(得分: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,那么您可以将模式保持在相同的位置,添加一个额外的列来存储用户的名称,使用触发器填充它并保持计算列有条件显示/不显示获胜者..