2013-01-24 19 views
11

Mam tabelę zawierającą dwie kolumny not nullCreated i Updated.Wyzwalacz po wstawieniu na niezerowej kolumnie

pisałem odpowiadające wyzwala

ALTER TRIGGER [dbo].[tr_category_inserted] ON [dbo].[Category] 
AFTER INSERT 
AS 
BEGIN 
    UPDATE Category 
    SET Created = GETDATE(), Updated = GETDATE() 
    FROM inserted 
    WHERE Category.ID = inserted.ID; 
END 

i

ALTER TRIGGER [dbo].[tr_category_updated] ON [dbo].[Category] 
AFTER UPDATE 
AS 
BEGIN 
    UPDATE Category 
    SET Updated = GETDATE() 
    FROM inserted 
     inner join [dbo].[Category] c on c.ID = inserted.ID 
END 

ale jeśli jestem wstawienie nowego wiersza pojawia się błąd

nie można wstawić wartość NULL do kolumny „Utworzono ", tabela " Kategoria "; kolumna nie zezwala na wartości null. INSERT nie działa.

Wstaw polecenie:

INSERT INTO [Category]([Name], [ShowInMenu], [Deleted]) 
    VALUES ('category1', 0, 0) 

Jak mogę napisać takie wyzwalacze bez ustawienia do tych kolumn, aby umożliwić zerowy?

+8

Jeśli chcesz automatycznie zaktualizować 'date' na' insert', sugeruję użycie ograniczenia 'default' zamiast' triggers' – DON

+3

Błąd występujący, ponieważ trigger działa po wstawieniu i nie wstawiasz wartości kolumn 'Created' i' Updated' w momencie wstawienia. – TechDo

+1

Ponieważ nazwa wyzwalacza już jest napisana, wyzwalacz uruchamia się ** PO ** wydaniu wstawienia - ale musisz podać ** wartość ** na "INSERT" dla dowolnej kolumny "NOT NULL". Musisz więc napisać wyzwalacz 'INSTEAD OF INSERT', aby ustawić początkową wartość tych kolumn - o wiele łatwiej: po prostu zdefiniuj ograniczenie" DEFAULT (GETDATE()) "w tej kolumnie, tak aby automatycznie wypełniało się' INSERT '.... –

Odpowiedz

3

Modyfikowanie tabeli tak:

ALTER TABLE yourTable MODIFY COLUMN updated timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP; 
ALTER TABLE yourTable MODIFY COLUMN created timestamp DEFAULT 0; 

Ustaw domyślną dla stworzony do kolumny 0. Niestety MySQL nie zezwala na dwa kolumny czasowe z domyślną wartością CURRENT_TIMESTAMP w jednej tabeli. Aby temu zaradzić, wystarczy wstawić wartość NULL do kolumny created, a obie kolumny będą miały bieżący znacznik czasu.

INSERT INTO yourTable (col1, created) VALUES ('whatever', NULL); 

Albo ustawić domyślną do ważnego znacznika czasu jak

ALTER TABLE yourTable MODIFY COLUMN created timestamp DEFAULT '1970-01-01 00:00:00'; 

i zmodyfikować spust tak:

ALTER TRIGGER [dbo].[tr_category_inserted] ON [dbo].[Category] 
AFTER INSERT 
AS 
BEGIN 
    UPDATE Category 
    SET Created = GETDATE() 
/* FROM inserted */ /*don't know where you got that from, do you port from SQL Server?*/ 
    WHERE Category.ID = NEW.ID; 
END 
1

Możliwe wykorzystanie INSTEAD OF spust

CREATE TRIGGER [dbo].[tr_category_inserted] ON [dbo].[Category] 
INSTEAD OF INSERT 
AS 
BEGIN 
    INSERT Category(Name, ShowInMenu, Deleted, Created, Updated) 
    SELECT Name, ShowInMenu, Deleted, GETDATE(), GETDATE() 
    FROM inserted i 
END 
0

I typowo wszystkie ow ostatniej zaktualizowanej kolumnie jest null, ponieważ chcę wiedzieć, czy jej nigdy nie zmieniono. Jeśli trzeba zachować obu pól pustych Dodam domyślną wartość tych kolumn, takich jak ten:

ALTER TABLE [dbo].[Category] ADD DEFAULT (getdate()) FOR [Created] 
GO 

ALTER TABLE [dbo].[Category] ADD DEFAULT (getdate()) FOR [LastUpdated] 
GO 

Wtedy nie trzeba będzie powód do wkładki.

Jeśli naprawdę chcesz użyć wyzwalacza, musisz podać wartość INSTEAD OF zamiast AFTER i dołączyć instrukcję wstawiania.

Powiązane problemy