Blog

Schemabinding in SQL

Anna
Teamleitung Website, Content & Marketing

Einleitung

Schemabindung ist ein optionales Attribut bei der Erstellung von Views oder Funktionen innerhalb einer Datenbank. Wenn Schemabindung für ein Objekt aktiviert ist, können die davon betroffenen Tabellen oder Tabellenspalten nicht modifiziert oder gelöscht werden. Das ist erst wieder möglich, wenn das Objekt mit Schemabindung geändert oder gelöscht wurde. Views mit Index sind automatisch schemagebunden, beziehungsweise muss eine View schemagebunden sein, damit ein Index erstellt werden kann.

Wenn wir eine View oder Funktion innerhalb unseres schemagebundenen Objektes referenzieren, muss diese ebenfalls schemagebunden sein und alle Objekte, auf die innerhalb der View zugegriffen wird, müssen sich in der selben Datenbank befinden wie die View.

Anwendung

Schemabindung dient dazu, unerwartete Änderungen an der Struktur eines Objekts zu vermeiden. Sie schafft Abhängigkeiten, die eine genauere Prüfung notwendig machen, bevor das Schema einer Tabelle verändert wird. Das ist vor Allem sinnvoll, wenn ein großes Team mit einer Datenbank arbeitet.

Wir erstellen eine neue View mit Schemabindung.

CREATE VIEW ShippingAddress (Addressline1)
WITH Schemabinding
AS
SELECT Address.Addressline1
FROM SalesLT.Address
INNER JOIN SalesLT.CustomerAddress
ON CustomerAddress.AddressID = Address.AddressID
WHERE CustomerAddress.AddressType = 'Shipping';

Ausgabe der eben erstellten View:

Jetzt versuchen wir, eine der betroffenen Tabellen zu beeinflussen, indem wir eine Spalte aus CustomerAddress löschen.

ALTER TABLE SalesLT.CustomerAddress
DROP COLUMN AddressID;

Dank Schemabindung kann diese Anfrage nicht ausgeführt werden.

Eine Namensänderung ist ebenfalls nicht möglich.

EXEC sp_rename 'SalesLT.CustomerAddress.AddressID', 'AdID', 'COLUMN';

Schemabindung verhindert auch das Löschen einer ganzen Tabelle, die benutzt wird.

DROP TABLE SalesLT.CustomerAddress;

Wir sehen also, dass Schemabindung dafür sorgt, dass unsere Views und Funktionen konsistent und in ihrer Abhängigkeit funktional bleiben. Durch die Fehlermeldungen werden wir auch direkt auf das betreffende Objekt aufmerksam gemacht. Wenn wir das Objekt mit Schemabindung löschen oder hier die gewünschten Änderungen zuerst vornehmen, funktionieren die obigen Anfragen.

Außerdem können wir Einfluss nehmen auf die Spalten und Tabellen, die von unserem Objekt mit Schemabindung nicht betroffen sind.

Wenn wir Schemabindung benutzen, ist die Syntax zum Anlegen des schemagebundenen Objekts leicht eingeschränkt: Wir können innerhalb der Definition nicht mit SELECT* arbeiten, sondern nur mit genauen Spaltenangaben. Außerdem müssen wir zweiteilige Namen benutzen: SchemaName.ObjektName. Einteilige, dreiteilige und vierteilige Namen sind nicht zugelassen.

Bei der Verwendung von Schemabindung ist außerdem zu beachten, dass die Funktionen sys.sp_refreshview und sys.sp_refreshsqlmodule nicht funktionieren. Diese Funktionen dienen dazu, nicht-schemagebundene Views und Module zu aktualisieren, wenn an den damit verbundenen Objekten Änderungen vorgenommen wurden, was natürlich bei Schemabindung wegfällt.

Schemabindung überprüfen

Wir können mit OBJECTPROPERTY prüfen, ob ein Objekt schemagebunden ist, im folgenden die Ausgabe aus der Microsoft Beispieldatenbank AdventureWorks2019:

SELECT OBJECTPROPERTY (OBJECT_ID ('[Production].[vProductAndDescription]'), 'isSchemaBound') as SchemaBound;
-- Ergebnis der Abfrage in AdventureWorks2019:
-- SchemaBound
-- 1

Wir können alternativ auch alle Objekte ausgeben lassen, bei denen Schemabindung aktiviert ist.

SELECT object_name(object_id) Objektname FROM sys.sql_modules WHERE is_schema_bound <> 0;
-- Ergebnis der Abfrage in AdventureWorks2019:
-- Objektname
-- vProductAndDescription
-- vStateProvinceCountryRegion
-- ufnLeadingZeros

Fazit

Schemabindung ist eine hilfreiche Option, um eine Datenbank vor unerwarteten Veränderungen in ihrer Struktur zu schützen. Es ist vor allem in großen Teams sinnvoll, Schemabindung einzusetzen, aber auch in kleinen Teams bietet es einen zusätzlichen Schritt, den Mitarbeitende gehen müssen, um eine Tabelle zu löschen oder Ähnliches. Im Allgemeinen ersetzt es aber keinesfalls die sinnvolle Verteilung von Rollen und Berechtigungen innerhalb einer Datenbank. Wichtigster Grund aus unserer Sicht und ein potentieller Performancebooster ist allerdings: Indizierung von Views kann nur durchgeführt werden, wenn die View schemagebunden ist. Damit entsteht dann in den Tiefen der Datenbank ein Objekt, das in etwa den Materialized Views bei Oracle entspricht und damit eigentlich eher einer Tabelle als einer View entspricht. Insbesondere benötigen derartige Objekte im Gegensatz zu “normalen” Views Storage.

Wenn Sie mehr über das Thema Schemabindung erfahren möchten und wie Sie es ggf. in Ihren Teams sinnvoll nutzen können, stehen Ihnen unsere Expert:innen dazu gerne zur Verfügung. Kontaktieren Sie uns dafür gerne über unser Kontaktformular und vereinbaren ein unverbindliches Erstgespräch mit uns.

Interesse geweckt?
Vielen Dank! Wir haben Ihre Anfrage erhalten!
Oops! Beim Senden ist etwas schiefgegangen, versuche es erneut.