触发器根据用户的信息生成userID

时间:2010-06-15 13:08:24

标签: sql-server triggers

我有投诉表
1.使用列进行tblProfile userId | name | age | address | mobileno |
2.使用列userId | role | status

的tblUserId

现在当用户填写表单时我要在tblProfile中插入一行,在插入新行之前我想create userId通过组合起始字母名称和移动号码然后插入到tblprofile中userId之后我想将UserId插入到tblUserId表中 为此,我必须使用两个触发器,一个是before insert触发器,另一个是after insert触发器。但我不知道如何捕获用户信息以创建userId以及如何将该Id传递给第二个触发器。

1 个答案:

答案 0 :(得分:1)

由于您的行为是INSERT,请尝试#insertedinserted作为插入值的容器。

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

我很长一段时间没有使用过触发器,但这可以帮助你获得所需的东西。

请注意以下链接:Using the inserted and deleted Tables

但是,您已拥有应用程序端的所有工具,因为您拥有处理内存中信息数据的信息和功能。

编辑#1

  

如何将此Id传递给第二个触发器?

在这种特殊情况下,我认为使用存储过程处理比使用两个独立触发器更合适。我们在这里有相互依赖的信息数据(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 的连接值插入temporary table。然后你应该有一个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,除非您从 tblProfile中删除具有此实际 userId 的记录

这是绝对的艰苦努力。这里不建议通过触发器进行处理,因为在插入tblProfile时,您没有tblUserId所需的信息数据,因此您必须连续两个DbCommand并启动两个ExecuteNonQuery()。对于这么小的任务来说,这是一个很大的开销。然后,按照建议处理存储过程会更加可行,并且它会确保DBMS本身的数据完整性,而不是通过 @@ ROWCOUNT 验证来模拟它。

  

免责声明:此代码按原样提供,如果没有您根据自己的情况进行调整,则无法保证编译。我没有验证就把它写在了我的头顶。

我希望这会有所帮助! =)