我有投诉表
1.使用列进行tblProfile
userId | name | age | address | mobileno |
2.使用列userId | role | status
现在当用户填写表单时我要在tblProfile
中插入一行,在插入新行之前我想create userId
通过组合起始字母名称和移动号码然后插入到tblprofile中userId之后我想将UserId插入到tblUserId
表中
为此,我必须使用两个触发器,一个是before insert
触发器,另一个是after insert
触发器。但我不知道如何捕获用户信息以创建userId以及如何将该Id传递给第二个触发器。
答案 0 :(得分:1)
由于您的行为是INSERT
,请尝试#inserted
或inserted
作为插入值的容器。
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 验证来模拟它。
免责声明:此代码按原样提供,如果没有您根据自己的情况进行调整,则无法保证编译。我没有验证就把它写在了我的头顶。
我希望这会有所帮助! =)