【问题标题】:Trigger Question!触发问题!
【发布时间】:2011-05-15 08:25:07
【问题描述】:

向 StackOverflow 社区致敬!

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

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

  • ID - 整数
  • 创建日期 - smalldatetime
  • Category_ID - 整数
  • 值 - ntext
  • 时间限制 - 小日期时间
  • 助手 - ntext(可为空)

另一个表 User_Questions 包含以下字段:

  • ID - 整数
  • Question_ID - 整数
  • User_ID - 整数
  • 创建日期 - smalldatetime
  • 助手 - ntext(可为空)。

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

那将不胜感激。

非常感谢您!

【问题讨论】:

  • 1.) 为什么要在两个表中保留相同的日期?这是多余的,不要这样做。 2.) 任何人都应该如何知道User_ID 值的来源?你不是这么说的。 3.) 有没有一个问题可以属于多个用户?
  • 请问到目前为止您尝试了什么?基于 MSDN msdn.microsoft.com/en-us/library/ms189799.aspx
  • 在这种情况下我更喜欢的一个选项是创建一个存储过程,该过程采用必要的输入参数,然后将您的两个输入输入到事务中的两个表中。这样你就可以控制正在发生的事情。众所周知,触发器很难正确,它们不能很好地扩展 - 如果可能的话,我会尽量避免触发器(并非总是可能,但通常是这样)
  • 您没有告诉我们您使用的是什么版本 SQL Server - 但如果您使用的是 2005 或更高版本,则应该避免 NTEXT 数据类型 - 改用 NVARCHAR(MAX)
  • @Tomalak 是的,你是对的,我将删除 UserQuestions 表中多余的 datecreated 字段。 User_ID 是一个外键字段,它指向用户表的 ID 字段。用户必须先登录才能提出问题。 3)我不太明白这个?你这是什么意思?

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


【解决方案1】:

在这种情况下,我更喜欢的一个选项是创建一个存储过程,该过程采用必要的输入参数,然后将您的两个输入输入到事务中的两个表中。这样您就可以控制正在发生的事情:

(假设 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

众所周知,触发器很难正确处理,它们不能很好地扩展 - 如果可能的话,我会尽量避免触发器(并非总是可能,但通常是这样) -

【讨论】:

  • 从您的声誉来看,我会认真对待您的回答 :)。根据我从您的回复中了解到的情况,您创建了一个存储过程,该过程在 Questions 表中插入一条记录,然后立即在 User_Questions 中插入一个新行。我对吗?我想我可以通过使用实体框架来获得相同的效果。你会推荐为此使用 LINQ 吗?到目前为止,我的整个数据库逻辑都是使用带有 EF 的 LINQ 语法编写的。我想我想问的是 LINQ to Entities 对于这个特定的问题是否是一个可行的选择?非常感谢您的回答!
  • 哦,顺便说一句,感谢您提出使用 NVARCHAR 的建议。当我设计表格时,我将其设置为 NVarChar,但与我一起做这个网站的朋友坚持使用 ntext,不知道为什么。由于他有 3 年的经验,我想我会按照他的建议去做。感谢分享知识!!
猜你喜欢
  • 1970-01-01
  • 2011-08-06
  • 2011-07-18
  • 2012-04-24
  • 2021-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-19
相关资源
最近更新 更多