【问题标题】:Creating Trigger for Insert row and Delete row为插入行和删除行创建触发器
【发布时间】:2014-11-11 16:56:13
【问题描述】:

我正在尝试为是否插入一行和是否删除一行创建触发器。如果插入一行,则打印语句将给出一条消息,如果删除一行,则打印语句将给出另一条消息。我的老师使用了这个示例,但是使用 DDL 语句而不是我输入的 DML 语句。我的问题是如何获得等价的,但要使其使 DML 语句可以工作?到目前为止,我的输出表明 else 打印语句是否插入或删除了一行。我不相信它甚至根本不计算插入语句。

这是我的架构。

CREATE TABLE dbo.Customers
(
    CustomerID          INT             NOT NULL IDENTITY PRIMARY KEY,
    CustomerFName       VARCHAR(30)     NOT NULL,
    CustomerLName       VARCHAR(30)     NOT NULL,
    CustomerAddress1    VARCHAR(50)     NOT NULL,
    CustomerAddress2    VARCHAR(50)     NULL,
    CustomerCity        VARCHAR(50)     NOT NULL,
    CustomerState       CHAR(2)         NOT NULL,
    CustomerZipCode     INT             NOT NULL,
    CustomerHome        VARCHAR(20)     NOT NULL,
    CustomerCell        VARCHAR(20)     NOT NULL,
    CustomerEmail       VARCHAR(50)     NULL
);

这是我已有的数据。

CustomerID  CustomerFName   CustomerLName   CustomerAddress1    CustomerAddress2        CustomerCity    CustomerState   CustomerZipCode CustomerHome    CustomerCell        CustomerEmail
1   Jane    Swanson 123 Negley Ave  Apartment #3    Pittsburgh  PA  15222   (412) 555 -     6678    (412) 555 - 6789    jane.swanson@gmail.com
2   Phillip Connely 167 Warble St   NULL    Pittsburgh  PA  15212   (412) 555 - 9463    (412) 555 - 6797    philli123@yahoo.com
3   Alfred  Mansley 41 Wild Place   Apartment #4    Pittsburgh  PA  15205   (412) 555 - 9371    (412) 555 - 4259    mansleyman592@gmail.com
4   Angel   Smith   2050 Morningside Ave    NULL    Pittsburgh  PA  15222   (412) 555 - 6931    (412) 555 - 1135    angie.smith01@hotmail.com
5   Walter  Weezley 2670 Butler St  NULL    Pittsburgh  PA  15210   (412) 567 - 6931    (412) 666 - 1256    walt.disney2012@gmail.com

触发器创建

CREATE TRIGGER Table_Update
   ON Customers
AFTER INSERT, DELETE
AS
    If EXISTS (SELECT 1 FROM inserted)
        PRINT 'The company has gained customers.'
    ELSE
       PRINT 'The company has lost customers.'

测试

INSERT INTO Customers
VALUES('Pter', 'Jackson', '1240 Wlnut St', 'Apartment #1', 'Pittsburgh',
'PA', 15232, '(724) 789 - 1234', '(724) 555 - 8706', 'pete.jack43@yahoo.com');

DELETE Customers
WHERE CustomerFName = 'Pter';

插入一行后,我收到消息:

公司赢得了客户。

消息 2601,级别 14,状态 1,过程 Table_Update,第 15 行
无法在具有唯一索引“IX_CustomerName”的对象“dbo.Customers”中插入重复的键行。重复键值为 (Jackson, Pter)。
声明已终止。

删除后我收到消息:

公司失去了客户。
(1 行受影响)
(1 行受影响)
(0 行受影响)

我想要的输出是添加一行或删除一行。即使我选择删除一个不存在的行,它似乎也会产生上述影响。它似乎在做的是创建不止一排。我在客户名称上有一个唯一键,因此如果客户出现多次,则会发生错误。如何让我的输出插入到插入的一行,而不是系统尝试多次插入同一行?

【问题讨论】:

  • 为什么不直接创建两个单独的触发器——一个用于INSERT,一个用于DELETE——这样你就不需要搞砸了它是什么,还有很多 IF 之类的东西......
  • 你能检查我上面的代码吗?我理解您的建议,并会在我的新代码正常运行后更改我的代码。
  • 'Pter', 'Jackson' 数据已经存在于表中,因为你有一个唯一索引,所以你不允许插入,因为你已经有一行 CustomerFName = 'Pter' 在你运行删除语句时被删除.
  • 在我运行脚本之前,我没有一个名为 Pter 的人。在我运行插入操作后,它会这样做。我从客户名称中删除了我的唯一索引,错误消失了,但插入时有两行受到影响。是来自插入表和客户表的组合吗?
  • 此外,该行甚至没有实际插入到我的客户表中。我不知道在这里做什么。

标签: sql-server triggers sql-insert sql-delete


【解决方案1】:

使用特殊表怎么样Inserted or Deleted

If exists (select 1 from inserted)
    PRINT 'The company has gained customers.'
ELSE
    PRINT 'The company has lost customers.'

【讨论】:

  • 如果我确实使用它,它会让我更接近,但是我让程序这么说。公司赢得了客户。消息 2601,级别 14,状态 1,过程 Table_Update,第 15 行无法在具有唯一索引“IX_CustomerName”的对象“dbo.Customers”中插入重复的键行。重复键值为 (Jackson, Pter)。声明已终止。
  • @ClintonScott 不查看表架构,这是无法修复的。您已在 CustomerName 上创建了唯一索引。看起来 table 已经有那些值“Jackson,Pter”你正在尝试再次插入它们。
  • 让我知道如何将架构发送给您,我会的。我应该把它贴在这里的某个地方吗?我向您保证,我不会再次尝试插入相同的行值。
  • @ClintonScott 在问题中添加客户表结构、约束、索引等。
  • 我刚刚添加了关系模式。
猜你喜欢
  • 2019-09-12
  • 2015-06-05
  • 2012-04-22
  • 2012-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-11
  • 1970-01-01
相关资源
最近更新 更多