2016-05-11 23 views
0

更新または挿入時にスクリプトを起動するトリガーを作成しました。しかし、トリガを実行すると、データベースがロックアップしてしまい、クエリを再度実行できるように再起動する必要があります。私はこれを引き起こすトリガーで何も見ていない。外部スクリプトファイルを起動するSQL Serverトリガー

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER TRIGGER [dbo].[CALCULATEDFIELDS] 
ON [dbo].[custom_values] 
AFTER INSERT, UPDATE 
AS 
    SET NOCOUNT ON; 

    DECLARE @CUSTOMIZED_ID VARCHAR(15) 

    SELECT @CUSTOMIZED_ID = (SELECT customized_id FROM inserted) 

    BEGIN 
     DECLARE @OUTSTRING varchar(300) 

     BEGIN 
      IF NOT @CUSTOMIZED_ID IS NULL 
       SELECT @OUTSTRING = '\\DRIVE\Folder\Script.vbs '+ @CUSTOMIZED_ID 
      ELSE 
       SELECT @OUTSTRING = '\\DRIVE\Folder\Script.vbs '+ @CUSTOMIZED_ID 

      EXEC master..xp_cmdshell @OUTSTRING, NO_OUTPUT 
     END 
    END 
+1

あなたのトリガーには、**行ごとに**と呼ばれると思われるという点でメジャー**の欠陥があります。**は**該当しません。トリガは**文ごとに** **起動します。したがって、このトリガを起動させる 'INSERT'文が25行挿入された場合、トリガは一度**発生しますが、' Inserted'擬似テーブルは25行あります。あなたのコードがここで選択する25行のうちどれですか? 'SELECT customized_id FROM inserted' - それは非決定論的です。**任意の行**を取得し、**すべての他の行を無視します**。これを考慮に入れてトリガーを書き直す必要があります。 –

+0

"customized_id"の行が挿入されているすべての行で同じになるかどうかは重要ですか?私は実際には、更新または挿入が行われたときにその値を取得する必要があります。 – AlexF11

答えて

0

次の文は、どんな意味がありません。

SELECT @CUSTOMIZED_ID = (SELECT customized_id FROM inserted) 

そして、実際にこのようなエラーで終わる必要があります。

Msg 512, Level 16, State 1, Line 6 
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression. 

それは(としてより多くの意味を確認する必要があり、この道をcustomized_idは常に同じです):

SELECT TOP 1 @CUSTOMIZED_ID = customized_id FROM inserted 

あなたの "ブロック"問題:

スクリプトを起動せずにアップデート(およびトリガ)を実行しようとしましたか?

アップデートは機能しますか?はいの場合、あなたのスクリプトの実行が長すぎるか、他に何か問題があるように見えます。あなたのスクリプトは更新後に実行されますか?それを確認しましたか?

また、なぜあなたは次のことを行いますか?いずれにしてもスクリプトを呼び出すか、間違っていますか?

IF NOT @CUSTOMIZED_ID IS NULL 
+0

私は実際にあなたの最初の変更を行った。私も気付いたのは、私が愚かにもmsgboxを私のスクリプトに残して、それが決して完了しないようにすることでした。 – AlexF11

+0

明らかにそれはまだ動作しておらず、さらに問題があるはずです。スクリプトをテストするために、私はそれをクエリウィンドウから起動し、完了し、期待通りにNULLを返しました。私はそれが冗長であり、スクリプトの実行をコメントアウトしたので、それを削除しました。更新は成功しました。ここで、EXECラインがトリガー内では機能しないが、その外では正常に動作する理由を理解する。 – AlexF11

+0

トリガーがトリガーされている更新スクリプトを投稿できますか?また、スクリプトがトリガーによって正しく呼び出されているかどうか(何もしません)を確認するために、あなたのvbsスクリプトを何も変更しないでください。その場合、トリガーが正常に動作し、スクリプトが正しく呼び出されることが確実になりますが、スクリプトの内部に問題があることがわかります。 – Reboon

関連する問題