2013-05-20 36 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操作的倒退 –