2015-02-18 3 views
0

Привет всем, так что я создал таблицу под названием ProductsAudit, который выглядит примерно так:SQL с помощью триггеров Для занесения Новая таблица

CREATE TABLE ProductsAudit 
(
AuditID INT NOT NULL PRIMARY KEY, 
ProductID INT NOT NULL, 
CategoryID INT NULL, 
ProductCode VARCHAR(10) NOT NULL, 
ProductName VARCHAR(255) NOT NULL, 
ListPrice MONEY NOT NULL, 
DiscountPercent MONEY NOT NULL, 
DateUpdated DATETIME NULL 
); 

ProductsAudit таблица почти идентична другой таблицы называется Продукты:

ProductID (PK, int, NOT NULL) 
CategoryID (FK, int, NULL) 
ProductCode (varchar(10), NOT NULL) 
ProductName(varchar(255), NOT NULL) 
Description(Text, NOT NULL) 
ListPrice(money, NOT NULL) 
DiscountPercent(money, NOT NULL) 
DateAdded(datetime, NULL) 

Затем я создал триггер под названием Products_UPDATE, который должен вставлять данные из таблицы Products в таблицу ProductAudit после обновления строки в продуктах.

CREATE TRIGGER Products_UPDATE 
ON Products 
AFTER UPDATE 
AS 
    INSERT INTO ProductsAudit (AuditID, ProductID, CategoryID, ProductCode, 
         ProductName, ListPrice, DiscountPercent, DateUpdated) 
    SELECT 
     i.ProductID, i.ProductID, i.CategoryID, i.ProductCode, 
     i.ProductName, i.ListPrice, i.DiscountPercent, i.DateAdded 
    FROM inserted i 
    JOIN ProductsAudit pa ON pa.ProductID = i.ProductID 

Теперь я предполагаю, что неправильно создаю свой триггер, потому что он, похоже, не работает. Например, я могу обновить таблицу продуктов следующим образом:

UPDATE PRODUCTS 
SET ProductCode = 'ABC1233' 
WHERE ProductID = 18; 
SELECT * FROM Products; 
SELECT * FROM ProductsAudit; 

Строка в продуктах обновляется правильно, однако я не получаю никаких данных, вставленных в таблицу ProductsAudit.

Кто-нибудь знает, что я делаю неправильно? Любая помощь будет принята с благодарностью! Благодаря!

+1

Ваш запрос присоединяется к ProductsAudit как часть вставки. Не совсем уверен, что вы пытаетесь сделать, но, вероятно, это проблема. Кроме того, вам действительно нужно изменить свой текстовый тип данных на varchar (max). Или даже разумный размер varchar. Текст устарел в течение 10 лет и не должен использоваться. –

+0

Этот триггер laguage может вообще не работать в mysql. Триггеры очень специфичны для базы данных. – HLGEM

ответ

0

Вы совершаете? Если вы этого не сделаете, вы, вероятно, не увидите ревизию. как вы можете откат или сообщение? какой db вы используете?

+0

Я использую Microsoft SQL Management Studio. Я не думаю, что мне нужно совершить, может быть, я ошибаюсь. – Blued00d

2

Почему вы подключаетесь к «ProductsAudit» в вашем триггере? это вызывает проблему здесь.

+0

Это была моя проблема, спасибо! Я неправильно понял, что я пытался сделать, я думал, что необходимо присоединиться к тому, где будут совпадать идентификаторы. – Blued00d

1
SELECT 
     i.ProductID, i.ProductID, i.CategoryID, i.ProductCode, 
     i.ProductName, i.ListPrice, i.DiscountPercent, i.DateAdded 
    FROM inserted i 
    JOIN ProductsAudit pa ON pa.ProductID = i.ProductID 

Это вставило бы запись, только если идентификатор продукта уже существовал в таблице аудита.

Лично я бы также добавил колонку, чтобы сообщить вам, какой пользователь внес изменения. Если что-то происходит, полезно знать, какой пользователь или приложение вызвали эту проблему.

Также почему данные для AuditID, ProductID одинаковы? В чем смысл иметь два поля?

Смежные вопросы