Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在不考虑if条件的情况下插入触发器激发 创建表帐户( 账户编号:, 平衡真实, 类型_代码int, 分行编号:, b代码int, 客户号, 约束帐户主键(帐户编号), 约束检查\平衡检查(平衡>=0) ); 在账户TBL中更改触发器tr检查账户 临时代替插入 作为 开始 声明@countint 声明@bcodeint 声明@cusNo int 选择@bcode=bcode,@cusNo=customer\u no 从插入; 选择@count=count(a.account\u no) 来自帐户a 其中a.bcode=@bcode和a.customer\u no=@cusNo 打印@计数; 如果(@count_Sql_Sql Server_Triggers - Fatal编程技术网

Sql 在不考虑if条件的情况下插入触发器激发 创建表帐户( 账户编号:, 平衡真实, 类型_代码int, 分行编号:, b代码int, 客户号, 约束帐户主键(帐户编号), 约束检查\平衡检查(平衡>=0) ); 在账户TBL中更改触发器tr检查账户 临时代替插入 作为 开始 声明@countint 声明@bcodeint 声明@cusNo int 选择@bcode=bcode,@cusNo=customer\u no 从插入; 选择@count=count(a.account\u no) 来自帐户a 其中a.bcode=@bcode和a.customer\u no=@cusNo 打印@计数; 如果(@count

Sql 在不考虑if条件的情况下插入触发器激发 创建表帐户( 账户编号:, 平衡真实, 类型_代码int, 分行编号:, b代码int, 客户号, 约束帐户主键(帐户编号), 约束检查\平衡检查(平衡>=0) ); 在账户TBL中更改触发器tr检查账户 临时代替插入 作为 开始 声明@countint 声明@bcodeint 声明@cusNo int 选择@bcode=bcode,@cusNo=customer\u no 从插入; 选择@count=count(a.account\u no) 来自帐户a 其中a.bcode=@bcode和a.customer\u no=@cusNo 打印@计数; 如果(@count,sql,sql-server,triggers,Sql,Sql Server,Triggers,如我在评论中所说,通常,Inserted可以并且将包含多行,而您当前的触发器无法处理该问题 但是如果您知道并且能够保证一次只插入一行,那么您的触发器仍然存在缺陷: 由于您使用的是而不是INSERT,在一切正常的情况下,您必须实际执行INSERT-此触发器运行,而不是通常的SQL INSERT…,因此如果一切正常,您需要执行INSERT操作 另外:不要在触发器中调用COMMIT,如果一切正常,它将自动处理。如果情况不好,仅使用ROLLBACK中止INSERT 您需要使用以下内容: CREATE

如我在评论中所说,通常,
Inserted
可以并且将包含多行,而您当前的触发器无法处理该问题

但是如果您知道并且能够保证一次只插入一行,那么您的触发器仍然存在缺陷:

  • 由于您使用的是
    而不是INSERT
    ,在一切正常的情况下,您必须实际执行
    INSERT
    -此触发器运行,而不是通常的SQL INSERT…,因此如果一切正常,您需要执行INSERT操作

  • 另外:不要在触发器中调用
    COMMIT
    ,如果一切正常,它将自动处理。如果情况不好,仅使用
    ROLLBACK
    中止
    INSERT

您需要使用以下内容:

CREATE TABLE Account(
    account_no int,
    balance real,
    type_code int,
    branch_no int,
    Bcode int,
    customer_no int,

    CONSTRAINT account_pk PRIMARY KEY (account_no),
    CONSTRAINT check_balance CHECK (balance>=0)
);

alter TRIGGER tr_check_accounts_in_accountTBL
ON account INSTEAD OF INSERT
AS
BEGIN
DECLARE @count int
DECLARE @bcode int
DECLARE @cusNo int

SELECT @bcode=bcode,@cusNo=customer_no
FROM inserted;

SELECT @count=COUNT(a.account_no)
FROM account a
WHERE a.bcode=@bcode AND a.customer_no = @cusNo
print @count;

IF(@count<=5)
    commit transaction
ELSE
        rollback transaction

END

INSERT INTO account(account_no,balance,type_code,bcode,branch_no,customer_no)
VALUES(1,60000,1,1,1,1);
CREATE TRIGGER tr\u check\u accounts\u in\u accountTBL
在dbo.Account上而不是INSERT上
作为
开始
声明@countint
声明@bcodeint
声明@cusNo int
选择@bcode=bcode,@cusNo=customer\u no
从插入;
选择@count=count(a.account\u no)
来自dbo.a账户
其中a.bcode=@bcode和a.customer\u no=@cusNo
如果(@count)中止插入
回滚事务
结束

另外:我强烈建议不要使用
real
作为你的货币价值-使用
DECIMAL(p,s)
相反!
REAL
在舍入错误和精度方面非常糟糕….

您需要重写触发器-您假设它在插入的
中总是只有一行-情况并非如此!如果插入多行,
Inserted
将包含多行,并且您的赋值
>选择@bcode=bcode,@cusNo=customer\u no FROM inserted;
将任意选择其中一行(并忽略其余行)。您的触发器需要处理
插入的
中的多行。此外,由于您使用的是
而不是插入的
触发器,因此由您在触发器中实际执行
插入
。我看不到任何地方会发生这种情况。…在
插入
之后,您不应该调用
提交
-这将在如果您想中止操作,只需使用
ROLLBACK
。您试图做的就是创建一个表,其中任何特定的
bcode
customer\u no
组合不能超过5行。谢谢您的评论,这对我非常有帮助。我尝试插入多行,并检查了发生的情况使用此命令选择*FROM INSERTED。然后我意识到插入行是逐步插入到插入表中的,一次只有一行。但是有一个逻辑错误,此触发器允许在相同的bcode和customer的帐户表中插入5个以上的帐户_no@SelaruSinbath:它允许6行-自您正在检查
@SelaruSinbath:如果这个答案帮助您解决了问题,那么请。这将表示您对那些花费自己的时间帮助您的人的感谢。我是stackoverfloe.com的新手。感谢您提供的信息+1
CREATE TRIGGER tr_check_accounts_in_accountTBL
ON dbo.Account INSTEAD OF INSERT
AS
BEGIN
    DECLARE @count int
    DECLARE @bcode int
    DECLARE @cusNo int

    SELECT @bcode = bcode, @cusNo = customer_no
    FROM inserted;

    SELECT @count = COUNT(a.account_no)
    FROM dbo.Account a
    WHERE a.bcode = @bcode AND a.customer_no = @cusNo

    IF(@count <= 5)
        -- all is well, now DO the insert!
        INSERT INTO dbo.Account (account_no, balance, type_code, branch_no, Bcode, customer_no)
           SELECT 
              account_no, balance, type_code, branch_no, Bcode, customer_no
           FROM 
              Inserted
    ELSE
       -- situation is not good -> abort the INSERT
       ROLLBACK TRANSACTION
END