ZAMIAST Z INSERT wyzwalaczy
ZAMIAST Z INSERT Wyzwalacze mogą być definiowane w widoku lub tabela, aby zamienić standardowe działanie instrukcja INSERT.Na ogół wyzwalacz INSERT INSTEAD Z definiowane jest w widoku, aby wstawić dane do jednego lub kilku tabel bazowych.
Kolumny na liście Wybierz widok może być pustych lub nie niewymaganym.Jeśli kolumna widoku nie zezwala na wartości null, instrukcja INSERT musi podać wartości dla kolumna.kolumna widoku umożliwia wartości null, jeśli wyrażenie, Definiowanie kolumna widoku zawiera elementy, takie jak:
Odwołania do każdej kolumna tabela bazowa, która zezwala na wartości null
Operatory arytmetyczne
Odwołania do funkcji
przypadek lub ŁĄCZONEJ z pustych subexpression
NULLIF
Można użyć AllowsNull właściwość zgłoszone przez funkcja COLUMNPROPERTY do ustalenia, czy kolumna widoku zezwala na wartości null.The sp_help procedura przechowywana also reports which view columns allow nulls.
Instrukcja INSERT, która odwołuje się do widoku, który ma wyzwalacz INSERT Z INSTEAD należy podać wartości dla każdej kolumna widoku, który nie zezwala na wartości null.Dotyczy to także kolumn widoku odwołujące się do kolumn w tabela bazowa, dla których wartości wejściowych nie można określić, takie jak:
Kolumny obliczane w tabela bazowa.
Kolumny identyfikacji w tabela bazowa, dla których IDENTITY INSERT jest wyłączona.
Utworzyć kolumny w tabela z timestamp Typ danych.
Jeśli wyzwalacz INSERT INSTEAD Z widoku generuje INSERT przed przy użyciu danych z tabela bazowa dodaje tabeli go musi ignorują wartości dla tych typów kolumn, nie dołączając kolumny na liście select w instrukcja INSERT. W instrukcja INSERT może generować fikcyjny wartości dla tych typów kolumn.
Na przykład w czasie, gdy instrukcja INSERT musi określić wartość dla kolumny widoku, który jest mapowany do tożsamości lub kolumna obliczana w tabela bazowa, można podać wartość symbol zastępczy.Wyzwalacz Z INSTEAD można zignorować wartości dostarczone, jeśli stanowi on instrukcja INSERT, która wstawia wartości do tabela bazowa.
Poniższe instrukcje tworzenia tabela, widoku i wyzwalacz, które ilustrują procesu:
CREATE TABLE BaseTable
(PrimaryKey int PRIMARY KEY IDENTITY(1,1),
Color nvarchar(10) NOT NULL,
Material nvarchar(10) NOT NULL,
ComputedCol AS (Color + Material)
)
GO
--Create a view that contains all columns from the base table.
CREATE VIEW InsteadView
AS SELECT PrimaryKey, Color, Material, ComputedCol
FROM BaseTable
GO
--Create an INSTEAD OF INSERT trigger on the view.
CREATE TRIGGER InsteadTrigger on InsteadView
INSTEAD OF INSERT
AS
BEGIN
--Build an INSERT statement ignoring inserted.PrimaryKey and
--inserted.ComputedCol.
INSERT INTO BaseTable
SELECT Color, Material
FROM inserted
END
GO
An INSERT instrukcja that refers directly to BaseTable cannot supply a value for the PrimaryKey and ComputedCol columns. Na przykład:
--A correct INSERT statement that skips the PrimaryKey and ComputedCol columns.
INSERT INTO BaseTable (Color, Material)
VALUES (N'Red', N'Cloth')
--View the results of the INSERT statement.
SELECT PrimaryKey, Color, Material, ComputedCol
FROM BaseTable
--An incorrect statement that tries to supply a value for the
--PrimaryKey and ComputedCol columns.
INSERT INTO BaseTable
VALUES (2, N'Green', N'Wood', N'GreenWood')
Jednak INSERT Instrukcja, która odwołuje się do InsteadView należy podać wartość w polu PrimaryKey i ComputedCol:
--A correct INSERT statement supplying dummy values for the
--PrimaryKey and ComputedCol columns.
INSERT INTO InsteadView (PrimaryKey, Color, Material, ComputedCol)
VALUES (999, N'Blue', N'Plastic', N'XXXXXX')
--View the results of the INSERT statement.
SELECT PrimaryKey, Color, Material, ComputedCol
FROM InsteadView
The inserted tabela passed to InsteadTrigger is built with a nonnullable PrimaryKey and ComputedCol kolumna; therefore, the INSERT instrukcja that is referencing the view must supply a value for those columns. Wartości 999 i N'XXXXXX' są przekazywane w celu InsteadTrigger, ale INSERT Instrukcja w wyzwalacz nie wybiera albo inserted.PrimaryKey lub inserted.ComputedCol; Dlatego wartości są ignorowane. Faktycznie wstawiony wiersz BaseTable ma 2 w PrimaryKey i N'BluePlastic' w ComputedCol.
Wartości zawarte w dodaje tabela dla obliczona tożsamości i timestamp kolumny są różne dla wyzwalaczy Z INSTEAD INSERT określony w porównaniu z wyzwalaczy Z INSTEAD określony w widokach tabel.
kolumna tabela bazowa |
Wartości w tabela wstawionej w każdy wyzwalacz INSERT dla tabela |
Wartość w tabela wstawionej w wyzwalacz INSERT Z INSTEAD na widoku |
|---|---|---|
Jest to kolumna obliczana. |
Wyrażenie obliczane |
Użytkownik określił wartość lub wartość NULL |
Zawiera właściwość tożsamości. |
0 Jeśli IDENTITY_INSERT jest wyłączona, określona wartość jeżeli IDENTITY_INSERT jest włączone |
Użytkownik określił wartość lub wartość NULL |
Ma timestamp Typ danych. |
Binarne zera, jeśli kolumna nie zezwala na wartości null, NULL, jeśli kolumna dozwolone są wartości null |
Użytkownik określił wartość lub wartość NULL |
Instrukcja INSERT, która odwołuje się bezpośrednio do tabela bazowa nie trzeba podać wartości dla kolumna NOT NULL, która ma również DOMYŚLNĄ definicją.Jeśli w instrukcja INSERT nie dostarcza wartości, używana jest wartość domyślna.Jeśli kolumna NOT NULL z DOMYŚLNĄ definicją odwołuje się proste wyrażenie w widoku, który ma wyzwalacz INSERT Z INSTEAD, jednak żadnych instrukcja INSERT odwoływania się do widoku należy podać wartość dla kolumny.Ta wartość jest wymagane do skonstruowania dodaje tabela przekazany do wyzwalacza.Konwencja jest wymagany dla wartości, które sygnalizuje do wyzwalacza użyta wartość domyślna.Konwencja najlepiej jest instrukcja INSERT podać wartość domyślną.
The deleted tabela in an INSTEAD OF INSERT trigger is always empty.