Вопрос триггера! - PullRequest
       3

Вопрос триггера!

0 голосов
/ 15 мая 2011

Приветствую сообщество StackOverflow!

Для этого нового проекта мне нужно написать триггер, который срабатывает при вставке строки в одну из таблиц.

У меня есть таблица с именем Вопросыкоторый содержит следующие поля:

  • ID - int
  • Дата создания - 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).

Теперь я думаю, что яможет написать триггер, который извлекает поля Datecreated и ID из таблицы вопросов и добавляет их в новую строку в таблице Users_Questions.Не могли бы вы посоветовать мне, как получить значение для поля User_ID?

Это будет с благодарностью.

Заранее большое спасибо!

1 Ответ

0 голосов
/ 15 мая 2011

Одним из вариантов, который я бы предпочел в этом случае, было бы создание хранимой процедуры, которая принимает необходимые входные параметры, а затем выполняет два ваших ввода в две таблицы в транзакции.Таким образом, вы контролируете, что происходит:

(это предполагает, что SQL Server 2005 и поля идентификатора имеют значение 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

Триггеры, как известно, трудно сделать правильно,они не очень хорошо масштабируются - я бы старался избегать триггеров, если это возможно (не всегда возможно, но часто это так) -

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...