【问题标题】:SQL table not showing inserted data after trigger creationSQL 表在触发器创建后不显示插入的数据
【发布时间】:2014-09-03 15:18:00
【问题描述】:

我创建了一个简单的表并在其中插入了一些值。然后我创建了一个代替触发器来阻止任何名为“John”的人插入一个值,也阻止任何已经回答过这个问题的人。 我的问题是,当我插入新值时,查询成功执行但表没有更新。

CREATE TABLE user_reponse(
    Username        VARCHAR(50),
    QuestionID      VARCHAR(10),
    Answer          CHAR(1)
    )

INSERT INTO user_reponse VALUES
('Tom', 'Q001', 'D'), ('Wendy', 'Q009', 'A'), ('Eddy', 'Q089', 'C'), ('David', 'Q001', 'C'), 
('Eve', 'Q001', 'D'), ('Paul', 'Q001', 'A'), ('Sam', 'Q001', 'B')


CREATE TRIGGER [dbo].[insert_instead_of]
    ON [dbo].[user_reponse]
INSTEAD OF insert
AS
IF (SELECT Username FROM inserted) = 'John'
BEGIN
RAISERROR('You have not paid up your fee', 16, 1)
SELECT * FROM inserted
ROLLBACK
END
IF EXISTS(SELECT a.Username, b.Username FROM user_reponse a, inserted b WHERE a.Username = b.Username)
BEGIN
RAISERROR('You have already submitted this question', 16, 1)
ROLLBACK
END


INSERT INTO user_reponse VALUES
('John', 'Q001', 'D')
INSERT INTO user_reponse VALUES
('zzz', 'Q002', 'A')

SELECT * FROM user_reponse

【问题讨论】:

  • 使用After insert update
  • 你是说sql,你真的是指微软sql-server ??请更新您的标签以包含您正在使用的实际、具体的数据库 - sql 只是许多 RDBMS 使用的查询语言 - 但触发器是高度特定于供应商的,因此我们需要知道你正在使用什么具体的数据库系统
  • 已解决 - 我需要在 IF 之后添加一个 ELSE 语句来插入插入的行 ELSE BEGIN INSERT INTO user_reponse SELECT * FROM inserted END

标签: sql triggers


【解决方案1】:

您正在使用INSTEAD OF-trigger - 因此执行触发器而不是被忽略的插入。我认为您宁愿使用BEFORE-trigger 来检查值,并可能在实际插入发生之前引发错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-01
    • 2018-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多