триггеры для генерации userID на основе информации о пользователе - PullRequest
0 голосов
/ 15 июня 2010

У меня есть таблица жалоб
1. Табличка с колонками userId | name | age | address | mobileno |
2. tblUserId со столбцами userId | role | status

теперь, когда пользователь заполняет форму, я хочу вставить одну строку в tblProfile, перед вставкой новой строки я хочу create userId, комбинируя начальные буквы имени и номера мобильного телефона и затем вставляя в tblprofile с userId после этого хотите вставить этот идентификатор пользователя в таблицу tblUserId.
для этого мне нужно использовать два триггера, один из которых - before insert trigger, а другой - after insert trigger.but, но я не знаю, как получить информацию о пользователе для создания userId и как передать этот Id во второй триггер.

1 Ответ

1 голос
/ 15 июня 2010

Поскольку вы действуете на INSERT s, попробуйте #inserted или inserted в качестве контейнера для вставки значений.

CREATE TRIGGER...
    insert into tblProfile (userId, name, age, address, mobileno) (
        select N'do-your-concat-here...', name, age, address, mobileno
            from inserted
    )

Я давно не работал с триггерами, но это должно помочь вам получить то, что вам нужно.

Просим обратить внимание на эту ссылку: Использование вставленных и удаленных таблиц .

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

РЕДАКТИРОВАТЬ # 1

какпередать этот идентификатор второму триггеру?

В этой конкретной ситуации я вижу больше подходящих для обработки с помощью хранимой процедуры, чем два независимых триггера.У нас есть взаимозависимые данные здесь (userId).Я думаю, что самый простой способ - это хранимая процедура.Рекомендуется заключить эти операции в область транзакции, так как если одна из вставок завершится неудачно, обе не будут применены, обеспечивая целостность данных.

CREATE PROCEDURE prcInsProfileUserId
    -- Assuming data types. Replace with proper data types as needed.
    @name nvarchar(50) NOT NULL 
    , @age int NOT NULL
    , @address nvarchar(150) NOT NULL
    , @mobileno bigint NOT NULL
    , @role nvarchar(10) NOT NULL
    , @status int NOT NULL
AS BEGIN TRANSACTION
    DECLARE @UserId nvarchar(10)
    SET @UserId = N'do-your-concat-here...';

    -- We then have the userId value, so we may insert into both tables accordingly.
    insert into tblProfile (userId, name, age, mobileno) 
        values (@userId, @name, @age, @address, @mobileno)

    insert into tblUserId (userId, role, status)
        values (@userId, @role, @status)

    COMMIT
END

Однако , если вы предпочитаетечтобы перейти к триггерам, альтернативой будет вставить объединенное значение для userId во временную таблицу .Затем у вас должен быть DDL, выглядящий следующим образом:

DECLARE @UserIdTempTable TABLE (
    userId nvarchar(10) NOT NULL
)

Затем в первом триггере вам нужно будет установить значение переменной @ userId , чтобы содержать соединенную вами userId , затем используйте его для вставки в tblProfile , затем выполните вторую вставку в @UserIdTempTable.

CREATE TRIGGER...
    DECLARE @userId nvarchar(10)
    SET @userId = N'do-your-concat-here...'

    insert into tblProfile (userId, name, age, address, mobileno) (
        select @userId, name, age, address, mobileno
            from inserted
    )

    IF @@ROWCOUNT > 0
    BEGIN
        delete from @UserIdTempTable -- assuring there is no mistake possible while populating and retrieving the userId
        insert into @UserIdTempTable (userId)
            values (@userId)
    END
END

Затем вы можете выбрать егоот вашего второго триггера.

CREATE TRIGGER second...
    insert into tblUserId (userId, role, status) (
        select tmp.userId, i.role i.status
            from @UserIdTempTable tmp
                , inserted i
    )

Будьте здесь осторожны, поскольку целостность данных не сохраняется абсолютно, поскольку первая вставка могла быть успешно обработана, а вторая - нет.Чтобы сохранить целостность данных, вам необходимо проверить, больше ли @@ ROWCOUNT 0, если только вы не удалили бы запись с этим фактическим userId из tblProfile .

Это абсолютная тяжелая ручная работа.Обработка через триггеры здесь не рекомендуется, поскольку при вставке tblProfile у вас нет информационных данных, необходимых для tblUserId, поэтому вам нужно иметь два DbCommand и запускать два ExecuteNonQuery() подряд.Это очень много для такой крошечной задачи.Тогда было бы удобнее обрабатывать хранимую процедуру, как это было предложено, плюс она обеспечивала целостность данных самой СУБД, а не имитировала ее посредством @@ ROWCOUNT проверки.

Отказ от ответственности: Этот код предоставляется "как есть" и не гарантирует компиляцию без вас, чтобы адаптировать его к вашей ситуации.Я написал это на макушке без проверки.

Надеюсь, это поможет!=)

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