2011-05-15 92 views
0

問候StackOverflow社區!觸發器問題!

對於這個新項目,我需要編寫一個觸發器,當一行插入到其中一個表中時觸發。

我有一個包含以下字段的表中調用問題:

  • ID - 詮釋
  • dateCreated會 - SMALLDATETIME
  • CATEGORY_ID - 詮釋
  • 價值 - NTEXT
  • 時限 - SMALLDATETIME
  • 幫手 - ntext(可爲空)

並且其包含以下字段的另一個表User_Questions:

  • ID - 詮釋
  • Question_ID - INT
  • USER_ID - INT
  • dateCreated會 - SMALLDATETIME
  • 幫手 - NTEXT(可爲空的) 。

現在我想我可以寫一個觸發器,從問題表中提取Datecreated和ID字段,並將它們添加到Users_Questions表中的新行。您可以請教我如何獲得User_ID字段的值嗎?

這將不勝感激。

非常感謝您提前!

+4

** 1。)**爲什麼要在兩個表中保留相同的日期?這是多餘的,不要這樣做。 ** 2。)**應該如何知道'User_ID'值來自哪裏?你不是那麼說的。 ** 3。)**是否有任何問題可以屬於多個用戶? – Tomalak 2011-05-15 08:29:52

+0

你到目前爲止嘗試過什麼?基於MSDN http://msdn.microsoft.com/en-us/library/ms189799.aspx – gbn 2011-05-15 08:30:37

+0

在這種情況下,我更喜歡的一種選擇是創建一個採用必要輸入參數的存儲過程,然後執行你的兩個輸入到事務中的兩個表中。這樣你就可以控制正在發生的事情。觸發器非常難以正確,它們不能很好地擴展 - 如果有可能,我會盡量避免觸發器(並不總是可能的,但通常是這樣) – 2011-05-15 08:35:54

回答

0

在這種情況下,我更喜歡的一種選擇是創建一個存儲過程,它接受必要的輸入參數,然後將兩個輸入輸入到事務中的兩個表中。你控制什麼方式是怎麼回事:

(假設SQL Server 2005中,和ID字段是INT IDENTITY - 正確的?)

CREATE PROCEDURE dbo.InsertQuestion 
    @Datecreated SMALLDATETIME, @Category_ID INT, 
    @Question NVARCHAR(MAX), @Timelimit SMALLDATETIME, 
    @helper NVARCHAR(MAX) 
AS BEGIN 
    -- start transaction and a TRY..CATCH block 
    BEGIN TRANSACTION 
    BEGIN TRY 
     -- insert values into "Questions" table 
     INSERT INTO 
      dbo.Questions(DateCreated, Category_ID, Question, TimeLimit, Helper) 
     VALUES 
      (@DateCreated, @Category_ID, @Question, @TimeLimit, @Helper) 

     -- retrieve the ID of the newly inserted row 
     DECLARE @QuestionID INT 
     SET @QuestionID = SCOPE_IDENTITY() 

     -- determine the user ID from SQL Server 
     DECLARE @UserID INT 
     SET @UserID = SUSER_ID() 

     -- insert values into "User_Questions" table 
     INSERT INTO 
      dbo.UserQuestions(QuestionID, UserID, DateCreated, Helper) 
     VALUES 
      (@QuestionID, @UserID, @DateCreated, @Helper) 

     -- commit transaction, if everything went well 
     COMMIT TRANSACTION 
    END TRY 
    BEGIN CATCH 
     -- handle your error, e.g. by logging to a table or something..... 
     ROLLBACK TRANSACTION 
    END CATCH 
END 

觸發器是非常難以得到正確的,他們不規模非常好 - 我會盡可能避免觸發器(並非總是可能,但通常是這樣) -

+0

從你的名聲來看,我會認真對待你的回答:)。根據我的理解,您創建了一個存儲過程,在「問題」表中插入一條記錄,然後在User_Questions中插入新行。我對嗎?我想我可以通過使用實體框架獲得相同的效果。你會推薦使用LINQ嗎?直到這一點,我的整個數據庫邏輯都是使用LINQ語法和EF編寫的。我想我要問的是,LINQ to Entities是否是一個可行的選項,可以解決這個特定問題?謝謝你的答案! – Dragan 2011-05-15 09:35:26

+0

哦,順便說一句,謝謝你使用NVARCHAR的建議。當我設計表格時,我將它設置爲NVarChar,但我在做這個網站的朋友堅持使用ntext,不知道爲什麼。由於他有3年的經驗,我想我會隨他的建議去做。感謝分享知識! – Dragan 2011-05-15 09:37:29