Update einer view with CHECK OPTION es gelingt unerwartet
Wie funktioniert das CHECK OPTION
Arbeit auf einen Blick? Wenn Sie versuchen, um die Ansicht zu aktualisieren, gelingt es.
CREATE TABLE [dbo].[Test](
[Country] [nvarchar](20) NULL
) ON [PRIMARY]
INSERT [Test] VALUES ('England'), ('USA'), ('Australia');
CREATE VIEW dbo.TestView AS
SELECT Country FROM dbo.Test
WHERE Country = N'USA'
WITH CHECK OPTION;
Ich versuchen, fügen Sie eine neue Zeile über die Sicht, und es ausfällt als erwartet, aufgrund der WITH CHECK OPTION
mit der erwarteten Fehlermeldung The attempted insert or update failed because the target view either specifies WITH CHECK OPTION
INSERT INTO dbo.TestView (Country) VALUES (N'Canada');
Diesem update, jedoch gelingt es ihm unerwartet:
UPDATE dbo.TestView SET Country = N'ddsffd';
Keine Zeilen zurückgegeben werden, die dann bei der Ausführung SELECT * FROM dbo.TestView
.
Was ist denn hier Los?
- Die UPDATE-Anweisung sollte in der Tat scheitern. Welche SQL-version verwenden Sie?
Du musst angemeldet sein, um einen Kommentar abzugeben.
UPDATE
- Anweisung löst eine Ausnahme nur, wenn die zugrunde liegende Tabelle enthält bereits Daten, die erfülltWHERE
Zustand in derVIEW
. AnsonstenUPDATE
Aussage nicht gegen dieCHECK
Zustand, denn es sind keine Daten für die änderung in derVIEW
.Check:
Ihrem Fall funktioniert für mich in MSSQL2008 (sowohl das INSERT und das UPDATE abgelehnt werden).
Beachten Sie, dass, wenn die Basistabelle der Sicht mit einem INSTEAD OF-trigger für INSERT und/oder UPDATE, die entsprechenden Aktionen auf dem Stadtplan wird stillschweigend ignorieren die WITH CHECK OPTION (auf der Grundlage, dass der Auslöser verändern die gelieferten Werte, so wird die Ansicht kann nicht wissen, ob die tatsächlichen eingefügten/aktualisierten Zeilen würde gegen die Ansicht filtern oder nicht).
Wenn du so ein Fall bist du gezwungen das zu schreiben INSTEAD OF-Trigger für die beiden INSERT-und UPDATE auf die Ansicht und prüfen Sie den filter selbst. Das bedeutet, dass die Einsätze auf die anzeigen wird nicht STANDARD-Klauseln aus der Basis-Tabelle berücksichtigt werden, so müssen Sie anwenden, ISNULL, um Werte aus EINGEFÜGT werden können, fügen Sie Sie in die Basis-Tabelle richtig).