Udostępnij przez


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.