问候StackOverflow社区!
对于这个新项目,我需要编写一个触发器,当一行插入其中一个表时触发该触发器。
我有一个名为Questions的表,其中包含以下字段:
和另一个表User_Questions,其中包含以下字段:
现在我想我可以编写一个触发器,它从Questions表中提取Datecreated和ID字段,并将它们添加到Users_Questions表中的新行。您能否就如何获取User_ID字段的值来建议我?
非常感谢。
非常感谢你!
答案 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
众所周知,触发器很难做到正确,它们不能很好地扩展 - 如果可能的话,我会尝试避免使用触发器(并非总是可行,但通常是这样) -