【发布时间】: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