【发布时间】:2017-12-12 18:03:05
【问题描述】:
我试图在插入名为 PersonalInfo 的表后编写一个触发器。 GenderID 和 id 是表 Gender 和 RegisterationForm 的外键。
DBLog 是我用来记录触发器操作的表。
这是我写的:
Create Trigger [dbo].[InsertPersonalInfoTrigger] ON [dbo].[PersonalInfo]
after Insert
as
begin
declare @Name nvarchar(50)
declare @FamilyName nvarchar(50)
declare @FatherName nvarchar(50)
declare @BirthDate nchar(10)
declare @GenderID int
declare @NationalId nvarchar(50)
declare @id int
select @Name=Max(@Name),@FamilyName=Max(@FamilyName),@FatherName=Max(@FatherName),@BirthDate=Max(@BirthDate)
,@GenderID=Max(@GenderID),@NationalId=Max(@NationalId),@id=Max(@id)
from Inserted
if(@Name='')
begin
RAISERROR ('Enter the Name',
16,
1
);
RollBack
return;
end
declare @LogID int
set @LogID= (select isnull(max(LogID),0) from DBLog) +1
declare @ActionDes varchar(2000);
set @ActionDes = 'Insert Into Gender INNER JOIN
PersonalInfo ON Gender.GenderID = PersonalInfo.GenderID INNER JOIN
RegisterationForm ON PersonalInfo.id = RegisterationForm.id(Name,FamilyName,FatherName,BirthDate,GenderID,NationalId,id)
Values("' + @Name + '","' + @FamilyName + '","' + @FatherName + '","' + @BirthDate + '",'+cast(@GenderID as varchar(20))+ ',
"' + @NationalId +'",'+cast(@id as varchar(20))+ ')';
declare @dt datetime;
set @dt=getdate();
declare @usr varchar(50);
select @usr =current_user
insert into DBLog(LogID,ActionDes,ActionTime,ActionUser)
values (@LogID,@ActionDes,@dt,@usr)
end
Go
当我尝试将数据插入到我的 PersonalInfo 表时执行触发器后,我收到以下错误:
没有更新任何行
第5行的数据没有提交
错误来源:.Net SqlClient 数据提供程序。
错误消息:无法将值 NULL 插入“ActionDes”列, 表'.dbo.DBLog';列不允许空值。INSERT 失败。
警告:空值被聚合或其他 SET 操作消除。
语句已终止。
确实,我不允许 NULL 进入我的 ActionDes 列,但我在这里插入数据。 NULL 来自哪里?有什么问题?
【问题讨论】:
-
这里有很多问题。它说“第 5 行”这一事实表明您正在插入多行,但是您将触发器编码为好像
inserted表只有一行?现在,我建议在日志表字段中允许 NULL 以帮助您进行调试。此外,建议您单独存储每个字段,而不是组成一个伪 sql (使用 " 分隔字符串意味着它永远无法执行) 来保存所有值。你不实际上知道这就是 INSERT 语句的样子,你在猜测。不要猜测,存储你知道的内容。 -
@MatBailie 我在创建触发器之前插入了 4 行,这就是为什么它说第 5 行。你能给我举个例子来说明如何分别存储每个字段吗?
标签: sql-server database sql-server-2008 triggers