多くの変数を使用せずにこの更新トリガを書き直す方法を教えてください。最初のT-SQL更新トリガを最適化する必要があります
私は最初のSQL Serverトリガを書きましたが、うまくいきましたが、より簡単な解決策が必要だと思います。
5つの列のうち少なくとも1つが変更された場合、別の表に2つの新しい行が書き込まれます。 行1 =古いFahrer(=ドライバ)と古いdispodateと更新時間 行2 =新しいFahrerと新しいdispodateとupdatedatetime 私の解決策はfoxpro-triggerの単なるコピーですが、T 1つの列が変更されているかどうかを確認する-SQL。
ALTER TRIGGER [dbo].[MyTrigger]
ON [dbo].[tbldisposaetze]
AFTER UPDATE
AS
SET NOCOUNT ON;
/*SET XACT_ABORT ON
SET ARITHABORT ON
*/
DECLARE @oldfahrer varchar(10)
DECLARE @oldbus varchar(10)
DECLARE @olddispodat date
DECLARE @oldvzeit decimal(4,0)
DECLARE @oldbzeit decimal(4,0)
DECLARE @oldbeschreibk varchar(255)
DECLARE @newfahrer varchar(10)
DECLARE @newbus varchar(10)
DECLARE @newdispodat date
DECLARE @newvzeit decimal(4,0)
DECLARE @newbzeit decimal(4,0)
DECLARE @newbeschreibk varchar(255)
SELECT @oldfahrer = fahrer,@oldbeschreibk=beschreibk,@oldbus=bus,@oldbzeit=bzeit,@olddispodat=dispodat,@oldvzeit=vzeit
FROM DELETED D
SELECT @newfahrer = fahrer,@newbeschreibk=beschreibk,@newbus=bus,@newbzeit=bzeit,@newdispodat=dispodat,@newvzeit=vzeit
FROM inserted I
if @oldbeschreibk <> @newbeschreibk or @oldbus <> @newbus or @oldbzeit <> @newbzeit or @oldfahrer <> @newfahrer or @oldvzeit <> @newvzeit
begin
IF (SELECT COUNT(*) FROM tbldispofahrer where [email protected] and [email protected]) > 0
update tbldispofahrer set laenderung = GETDATE() where [email protected] and [email protected]
else
INSERT into tbldispofahrer (fahrer,dispodat,laenderung) VALUES (@oldfahrer,@olddispodat,getdate())
IF (SELECT COUNT(*) FROM tbldispofahrer where [email protected] and [email protected]) > 0
update tbldispofahrer set laenderung = GETDATE() where [email protected] and [email protected]
else
INSERT into tbldispofahrer (fahrer,dispodat,laenderung) VALUES (@newfahrer,@newdispodat,getdate())
end
!!これまでどんなトリガーでも。削除され挿入されたテーブルには複数のレコードが含まれている可能性があります。 – HLGEM
あなたのトリガーは、あなたが**行ごとに一度**呼び出されると仮定しているように見えるという点で、**主な**の欠陥を持っています** - **そうではありません。トリガは**文ごとに** **起動します。したがって、 'UPDATE'文が25行に影響を与えると、トリガは一度**発生しますが、' Inserted'と 'Deleted'はそれぞれ25行。あなたの 'SELECT'コードは25行のどれを選択しますか?それは非決定的です。これを考慮に入れてトリガーを書き直す必要があります。 –
'tbldispofahrer'テーブルの主キー列は何ですか? –