sql - T-SQL插入触发器在多个表上根据if条件插入、更新

标签 sql sql-server triggers insert updates

我在尝试解决 SQL 触发器以自动将用户设置为阻止并创建包含另一个表中的日期的阻止记录(如果其到期日期等于设置日期)时遇到一些问题。

问题是当触发器被插入触发时,打印语句被执行并且插入发生,但是插入到表中却没有,或者更新语句?谁能解释一下为什么?

注意: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

最佳答案

Transact-SQL 中的 IF 语句要求条件后有一个语句:

IF <i>condition</i>
  <i>statement</i>;

如果要在同一分支中执行多个语句,则必须将它们括在BEGIN/END“括号”中:

IF <i>condition</i>
BEGIN
  <i>statement</i>;
  <i>statement</i>;
  ...
END;

在触发器中,仅根据 (Select [DueDate] from insert) = '2011-01-01' 条件的结果执行 INSERT 语句。至于 PRINT 和 UPDATE,它们都是无条件执行的,即在每次插入Account之后执行。因此,您可能需要在 INSERT、UPDATE 和 PRINT 周围添加 BEGINEND:

...
If(Select [DueDate] from inserted) = '2011-01-01'
<b>BEGIN</b>
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';
<b>END</b>;
...

关于sql - T-SQL插入触发器在多个表上根据if条件插入、更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13897321/

相关文章:

sql - 这可以在 SQL 2008 中完成吗?

c# - 有没有办法在 EF4 中定义类似 SQL 触发器的机制?

mysql - 我想要一个触发器从 MySQL 中的 2 个表中删除

java - 将Triggeres应用于进度openge数据库

MySQL_如何对另一列上具有相同值的每两列中的值求和?

mysql - 为类别、子类别和相关图书设计数据库

mysql - SQL 连接多个表并按单列排序

sql - MySQL合并多行

php - 如何计算属于另一列中不同值的列中的所有相同值

SQL IF EXISTS 行为怪异