Bag*_*erz 7 sql sql-server triggers insert updates
我有一些问题试图解决SQL触发器自动设置用户被阻止并创建包含另一个表中的日期的块记录,如果他们的截止日期等于设置日期.
问题是当插入触发器触发时,执行print语句并发生插入,但是插入到表中却没有,或者更新语句?有谁能解释为什么?
注意: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,
Run Code Online (Sandbox Code Playgroud)
BLOCKEDUSER TABLE
CREATE TABLE [dbo].[BlockedUsers](
[BlockID] [int] IDENTITY(1,1) NOT NULL,
[DateEnforced] [dbo].[dates] NOT NULL,
[Blocked] [dbo].[switch] NOT NULL,
Run Code Online (Sandbox Code Playgroud)
触发
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
Run Code Online (Sandbox Code Playgroud)
完全工作示例:使用下面的帮助完成.
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
Run Code Online (Sandbox Code Playgroud)
将IF在Transact-SQL语句要求的条件后一条语句:
IF condition
statement;
Run Code Online (Sandbox Code Playgroud)
如果要在同一分支中执行多个语句,则必须将它们括在BEGIN/ END"括号"中:
IF condition
BEGIN
statement;
statement;
...
END;
Run Code Online (Sandbox Code Playgroud)
在触发器中,仅根据(Select [DueDate] from inserted) = '2011-01-01'条件的结果执行INSERT语句.对于PRINT和UPDATE,它们无条件地执行,即在每次插入之后执行Account.所以,你可能需要添加BEGIN和END周围的INSERT,UPDATE和两个打印:
...
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;
...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
41298 次 |
| 最近记录: |