触发问题!

时间:2011-05-15 08:25:08

标签: asp.net sql sql-server database triggers

问候StackOverflow社区!

对于这个新项目,我需要编写一个触发器,当一行插入其中一个表时触发该触发器。

我有一个名为Questions的表,其中包含以下字段:

  • ID - int
  • Datecreated - smalldatetime
  • Category_ID - int
  • 价值 - ntext
  • Timelimit - smalldatetime
  • helper - ntext(nullable)

和另一个表User_Questions,其中包含以下字段:

  • ID - int
  • Question_ID - int
  • User_ID - int
  • Datecreated - smalldatetime
  • helper - ntext(nullable)。

现在我想我可以编写一个触发器,它从Questions表中提取Datecreated和ID字段,并将它们添加到Users_Questions表中的新行。您能否就如何获取User_ID字段的值来建议我?

非常感谢。

非常感谢你!

1 个答案:

答案 0 :(得分: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

众所周知,触发器很难做到正确,它们不能很好地扩展 - 如果可能的话,我会尝试避免使用触发器(并非总是可行,但通常是这样) -