web-dev-qa-db-ja.com

複数のテーブルのif条件で挿入、更新するT-SQL挿入トリガー

期限が設定された日付と等しい場合、SQLトリガーを解決して、ユーザーを自動的にブロックに設定し、別のテーブルに日付を含むブロックレコードを作成しようとすると、いくつかの問題が発生します。

問題は、挿入によってトリガーがオフにされると、printステートメントが実行されて挿入が発生するが、テーブルへの挿入は実行されない、またはupdateステートメント?誰かが理由を説明できますか?

注:insertステートメントとUpdateステートメントはどちらも、単独で実行すると問題ありません。

アカウントテーブル

CREATE TABLE [dbo].[Account](
[AccountNo] [int] IDENTITY(1,1) NOT NULL,
[CustomerNo] [int] NOT NULL,
[PaymentNo] [int] NULL,
[CreditNo] [int] NULL,
[BlockID] [dbo].[number] NULL,
[Balence] [dbo].[currency] NOT NULL,
[AmountDue] [dbo].[currency] NOT NULL,
[DueDate] [dbo].[dates] NULL,
[AutherisedBy] [nvarchar](50) NOT NULL,
[DateCreated] [date] NOT NULL,

ブロックされたユーザーテーブル

CREATE TABLE [dbo].[BlockedUsers](
[BlockID] [int] IDENTITY(1,1) NOT NULL,
[DateEnforced] [dbo].[dates] NOT NULL,
[Blocked] [dbo].[switch] NOT NULL,

引き金

ALTER TRIGGER [dbo].[Add_Blocked_User]
ON [dbo].[Account]
FOR INSERT
AS  
BEGIN
SET NOCOUNT ON;

Declare @ID int
Select @ID = [AccountNo] from inserted  
If(Select [DueDate] from inserted) = '2011-01-01'

INSERT INTO dbo.BlockedUsers(DateEnforced,Blocked)
VALUES (GETDATE(),1)
PRINT 'New Block Date Added'

UPDATE Account 
Set BlockID = IDENT_CURRENT('BlockID')
where @ID = @ID
PRINT 'Account Blocked'

END

GO

完全に機能する例:以下のヘルプを使用して完了します。

ALTER TRIGGER [dbo].[Add_Blocked_User]
ON [dbo].[Account]
AFTER INSERT
AS 
BEGIN

SET NOCOUNT ON;

Declare @ID int
Select @ID = [AccountNo] from inserted  
 If(Select [DueDate] from inserted)Not Between (select CONVERT(date, getdate() - 30)) And (select CONVERT(date, getdate()))
Begin
    INSERT INTO dbo.BlockedUsers(DateEnforced,Blocked)
    VALUES (GETDATE(),1)
    PRINT 'New Block Date Added'

    UPDATE Account 
    Set BlockID = (Select Max(BlockID) From BlockedUsers)
    where [AccountNo] = (Select [AccountNo] from inserted)  
    PRINT 'Account Blocked'
 End

 END

GO
7
Baggerz

Transact-SQLのIFステートメントは、条件の後に単一のステートメントを想定しています。

IF conditionstatement;

同じブランチで複数のステートメントを実行する場合は、それらをBEGIN/END "brackets"で囲む必要があります。

IF condition
BEGIN
  statement;
  statement;
  ...
END;

トリガーでは、(Select [DueDate] from inserted) = '2011-01-01'条件の結果に応じて、INSERTステートメントのみが実行されます。 PRINTとUPDATEはどちらも無条件に実行されます。つまり、everyAccountに挿入された後です。したがって、おそらくINSERT、UPDATE、および両方のPRINTの周囲にBEGINENDを追加する必要があります。

...
If(Select [DueDate] from inserted) = '2011-01-01'
BEGIN
INSERT INTO dbo.BlockedUsers(DateEnforced,Blocked)
VALUES (GETDATE(),1);
PRINT 'New Block Date Added';

UPDATE Account 
Set BlockID = IDENT_CURRENT('BlockID')
where @ID = @ID;
PRINT 'Account Blocked';
END;
...
5
Andriy M