PersonalInfoというテーブルの挿入後にトリガーを書き込もうとしています。 GenderIDとidは、テーブルGenderとRegisterationFormの外部キーです。トリガーAFTER INSERT結果がログテーブルにNULLを挿入できません
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テーブルにデータを挿入しようとすると、私は次のエラーを取得する:
No row was updated
The data in row 5 was not comitted
Error Source: .Net SqlClient Data Provider.
Error Message: Cannot insert the value NULL into column 'ActionDes', table '.dbo.DBLog'; column does not allow nulls.INSERT fails.
Warning: Null value is eliminated by an aggregate or other SET operation.
The statement has been terminated.
それは私は事実です私のActionDesカラムにNULLを許さないのですが、ここで私はデータを挿入しています。 NULLはどこから来ますか?どうしたの?
ここには多くの問題があります。 「行5」は複数の行を挿入していることを示していますが、挿入された表には1つの行しかないかのように動作するようにトリガーがコーディングされていますか?今のところ、ロギングテーブルのフィールドには、デバッグに役立つNULLを許可することをお勧めします。また、psuedo-sql *を構成する代わりに、各フィールドを別々に格納することをお勧めします(文字列をデリミートすることは決して実行できないことを意味します)*すべての値を保持する*実際には**** – MatBailie
@MatBailieトリガーを作成する前に4行挿入しました。そのため、5行目と言いました。 –