0

レコードをリレーショナル テーブルに挿入し、各テーブルに対してクエリを実行しない方法はありますか?

新しいログを挿入する必要があります: l_WinUser、l_Status、t_StartTime、t_StartDate ここで、ユーザー名 = ユーザー名、g_Exe = g_Exe

もしそうなら、.NET で挿入されたレコード ID を取得する方法はありますか? 現在、挿入されたログを取得するために別のクエリを実行しています (正常に動作します)。

SELECT TOP (1) Logs.l_LogID 
FROM Logs 
INNER JOIN Game ON Logs.g_GameID = Game.g_GameID 
INNER JOIN Member ON Logs.m_MemberID = Member.m_MemberID 
WHERE (Game.g_Exe = @exe) 
AND (Member.m_Username = @username) 
AND (Logs.l_WinUser = @winUser)
ORDER BY Logs.l_LogID DESC

ERD は次のとおりです。

エルド

どうもありがとう。

4

1 に答える 1

2

VIEW、INSTEAD OF INSERT トリガーを作成し、INSERTそれに対して 1 つの -Statement を実行できます。

create View View_Logs 
as
select l_WinUser, 
       l_Status, 
       t_StartTime, 
       1t_StartDate,
       username,
       g_Exe
FROM Logs 
INNER JOIN Game ON Logs.g_GameID = Game.g_GameID 
INNER JOIN Member ON Logs.m_MemberID = Member.m_MemberID 

次のように新しいエントリを挿入します

insert into View_logs
  (l_WinUser,l_status, lt_StartDate,username,g_exe)
values
  ('Foo', 1, GetDate(),'BarUser','SomeEXE')

l_LogIDを使用して新しいものを取得します

select SCOPE_IDENTITY()

注: 最初の試みで、ビューに対する INSERT は関連するテーブルも挿入/更新すると書きましたが、これは正しくありません。だから私はこの答えを修正しました。

そして、これがトリガーです(テストされていません):

create trigger YourTriggerName on View_ogs
for instead of insert 
as
declare @GameID int, @MemberID int, @timeKey int

select @GameID=g_GameID from Game g join inserted i on g.g_Exe = i.g_exe
if @GameID is null begin
  insert into Game (g_exe) select g_exe from Inserted
  select @GameID = SCOPE_IDENTITY()
  end

select @MemberID=m.m_memberID from Member m join inserted i on m_username = i.username
if @MemberID is null begin
  insert into Member (m_username) select username from Inserted
  select @MemberID = SCOPE_IDENTITY()
  end

select @timeKey=t.t_timeKey 
from Time_Date t 
     join inserted i 
       on t.t_StartTime=i.t_StartTime 
      and t.t_StartDate = t_StartDate

if @timeKey is null begin
  insert into Time_Date (t_StartTime, t_StartDate) select t_StartTime, t_StartDate from Inserted
  select @timeKey = SCOPE_IDENTITY()
  end

set nocount off
insert into Logs
  (l_WinUser, l_Status, m_MemberID, g_GameID, t_TimeKey)
  select l_WinUser, l_Status, @MemberID, @GameID, @timekey)
于 2013-03-17T10:24:08.353 に答える