Aktualisieren von LBAC-geschützten Daten
Ihre LBAC-Berechtigungsnachweise müssen Ihnen Schreibzugriff auf Daten erlauben, damit Sie sie aktualisieren können. Für die Aktualisierung einer geschützten Zeile müssen Ihnen Ihre LBAC-Berechtigungsnachweise außerdem den Lesezugriff auf die Zeile erlauben.
Aktualisieren geschützter Spalten
Wenn Sie versuchen, Daten in einer geschützten Spalte zu aktualisieren, werden Ihre LBAC-Berechtigungsnachweise mit dem Sicherheitskennsatz verglichen, der die Spalte schützt. Der Vergleich, der vorgenommen wird, bezieht sich auf den Schreibzugriff. Wenn der Schreibzugriff blockiert wird, wird ein Fehler zurückgegeben und die Ausführung der Anweisung schlägt fehl. Anderenfalls wird die Aktualisierung fortgesetzt.
Detaillierte Informationen dazu, wie Ihre LBAC-Berechtigungsnachweise mit einem Sicherheitskennsatz verglichen werden, finden Sie in dem Abschnitt über den Vergleich von LBAC-Sicherheitskennsätzen.
Nehmen Sie an, in einer Tabelle T1 werden die Spalte DEPTNO durch einen Sicherheitskennsatz L2 und die Spalte PAYSCALE durch einen Sicherheitskennsatz L3 geschützt. Die Tabelle T1 sieht einschließlich ihrer Daten wie folgt aus:
| EMPNO | LASTNAME | DEPTNO
Geschützt durch L2 |
PAYSCALE
Geschützt durch L3 |
|---|---|---|---|
| 1 | Rjaibi | 11 | 4 |
| 2 | Miller | 11 | 7 |
| 3 | Bird | 11 | 9 |
UPDATE T1 SET EMPNO = 4
WHERE LASTNAME = "Bird"Diese Anweisung wird ohne Fehler ausgeführt, da sie keine geschützten Spalten aktualisiert. Die Tabelle T1 sieht nun folgendermaßen aus:
| EMPNO | LASTNAME | DEPTNO
Geschützt durch L2 |
PAYSCALE
Geschützt durch L3 |
|---|---|---|---|
| 1 | Rjaibi | 11 | 4 |
| 2 | Miller | 11 | 7 |
| 4 | Bird | 11 | 9 |
UPDATE T1 SET DEPTNO = 55
WHERE LASTNAME = "Miller"Die Ausführung dieser Anweisung schlägt unter Rückgabe eines Fehlers fehl, weil die Spalte DEPTNO geschützt wird und der Benutzer Lhakpa keine LBAC-Berechtigungsnachweise besitzt.
Nehmen Sie an, dem Benutzer Lhakpa werden LBAC-Berechtigungsnachweise erteilt, die ihm die in der folgenden Tabelle zusammengefassten Zugriffsmöglichkeiten gewähren. Wie diese Berechtigungsnachweise im Einzelnen aussehen und welche Elemente sich in den Sicherheitskennsätzen befinden, spielt für dieses Beispiel keine wichtige Rolle.
| Schützender Sicherheitskennsatz der Daten | Lesezugriff? | Schreibzugriff? |
|---|---|---|
| L2 | Nein | Yes |
| L3 | Nein | Nein |
UPDATE T1 SET DEPTNO = 55
WHERE LASTNAME = "Miller"Diesmal wird die Anweisung ohne Fehler ausgeführt, weil die LBAC-Berechtigungsnachweise des Benutzers Lhakpa ihm einen Schreibzugriff auf Daten erlauben, die durch den Sicherheitskennsatz geschützt werden, der die Spalte DEPTNO schützt. Dabei spielt es keine Rolle, dass er nicht berechtigt ist, Daten eben dieser Spalte zu lesen. Die Daten der Tabelle T1 sehen nun folgendermaßen aus:
| EMPNO | LASTNAME | DEPTNO
Geschützt durch L2 |
PAYSCALE
Geschützt durch L3 |
|---|---|---|---|
| 1 | Rjaibi | 11 | 4 |
| 2 | Miller | 55 | 7 |
| 4 | Bird | 11 | 9 |
UPDATE T1 SET DEPTNO = 55, PAYSCALE = 4
WHERE LASTNAME = "Bird"Die Spalte PAYSCALE wird durch den Sicherheitskennsatz L3 geschützt, und die LBAC-Berechtigungsnachweise des Benutzers Lhakpa erlauben ihm keinen Schreibzugriff auf sie. Da Lhakpa nicht in der Lage, Daten in die Spalte zu schreiben, schlägt die Aktualisierung fehl, sodass keine Daten geändert werden.
Aktualisieren geschützter Zeilen
Wenn Ihre LBAC-Berechtigungsnachweise keinen Lesezugriff auf eine Zeile zulassen, dann verhält sich das System so, als wäre diese Zeile für Sie nicht vorhanden. Daher haben Sie auch keine Möglichkeit, diese Zeile zu aktualisieren. Für Zeilen, die Sie lesen können, benötigen Sie zusätzlich einen Schreibzugriff, um die Zeile aktualisieren zu können.
Wenn Sie versuchen, eine Zeile zu aktualisieren, werden Ihre LBAC-Berechtigungsnachweise für den Schreibzugriff mit dem Sicherheitskennsatz verglichen, der die Zeile schützt. Wenn der Schreibzugriff blockiert wird, schlägt die Aktualisierung fehl und ein Fehler wird zurückgegeben. Wenn der Schreibzugriff nicht blockiert wird, wird die Aktualisierung fortgesetzt.
Die Aktualisierung wird abgesehen von der Behandlung der Spalte mit dem Datentyp DB2SECURITYLABEL auf die gleiche Weise wie eine Aktualisierung an einer nicht geschützten Zeile ausgeführt. Wenn Sie den Wert für diese Spalte nicht explizit festlegen, wird er automatisch auf den Sicherheitskennsatz gesetzt, den Sie für den Schreibzugriff besitzen. Wenn Sie keinen Sicherheitskennsatz für den Schreibzugriff haben, wird ein Fehler zurückgegeben und die Ausführung der Anweisung schlägt fehl.
Wenn die Aktualisierung explizit einen Wert für die Spalte mit dem Datentyp DB2SECURITYLABEL angibt, werden Ihre LBAC-Berechtigungsnachweise erneut überprüft. Wenn die Aktualisierung, die Sie auszuführen versuchen, eine Zeile erstellen würde, auf die Ihre LBAC-Berechtigungsnachweise keinen Schreibzugriff zuließen, hängt die weitere Verarbeitung von der Sicherheitsrichtlinie ab, welche die Tabelle schützt. Wenn die Sicherheitsrichtlinie die Option RESTRICT NOT AUTHORIZED WRITE SECURITY LABEL enthält, schlägt die Aktualisierung fehl und es wird ein Fehler zurückgegeben. Wenn die Sicherheitsrichtlinie die Option RESTRICT NOT AUTHORIZED WRITE SECURITY LABEL nicht enthält oder stattdessen die Option OVERRIDE NOT AUTHORIZED WRITE SECURITY LABEL enthält, wird der Sicherheitskennsatz, den Sie angeben, ignoriert und der Sicherheitskennsatz für den Schreibzugriff verwendet, sofern Sie einen haben. Wenn Sie keinen Sicherheitskennsatz für den Schreibzugriff haben, wird ein Fehler zurückgegeben.
Nehmen Sie an, die Tabelle T1 wird durch eine Sicherheitsrichtlinie mit dem Namen P1 geschützt und enthält eine Spalte mit dem Namen LABEL, die den Datentyp DB2SECURITYLABEL hat.
| EMPNO | LASTNAME | DEPTNO | ETIQUETTE |
|---|---|---|---|
| 1 | Rjaibi | 11 | L1 |
| 2 | Miller | 11 | L2 |
| 3 | Bird | 11 | L3 |
Nehmen Sie an, die Benutzerin Jenni besitzt LBAC-Berechtigungsnachweise, die ihr einen Lese- und einen Schreibzugriff auf Daten erlauben, die durch die Sicherheitskennsätze L0 und L1 geschützt werden, jedoch nicht auf Daten, die durch beliebige andere Sicherheitskennsätze geschützt werden. Der Sicherheitskennsatz, den Sie für den Schreib- und den Lesezugriff besitzt, ist jeweils L0. Die vollständigen Details ihrer Berechtigungsnachweise sowie die einzelnen Elemente, die in den Kennsätzen enthalten sind, spielen für dieses Beispiel keine wichtige Rolle.
SELECT * FROM T1Jenni wird nur eine Zeile aus der Tabelle angezeigt:| EMPNO | LASTNAME | DEPTNO | ETIQUETTE |
|---|---|---|---|
| 1 | Rjaibi | 11 | L1 |
Die Zeilen, die durch die Kennsätze L2 und L3 geschützt werden, gehören nicht zur Ergebnismenge, weil Jennis LBAC-Berechtigungsnachweise keinen Lesezugriff auf diese Zeilen zulassen. Für Jenni verhält es sich so, als ob diese Zeilen nicht vorhanden wären.
UPDATE T1 SET DEPTNO = 44 WHERE DEPTNO = 11;
SELECT * FROM T1;| EMPNO | LASTNAME | DEPTNO | ETIQUETTE |
|---|---|---|---|
| 1 | Rjaibi | 44 | L0 |
| EMPNO | LASTNAME | DEPTNO | ETIQUETTE |
|---|---|---|---|
| 1 | Rjaibi | 44 | L0 |
| 2 | Miller | 11 | L2 |
| 3 | Bird | 11 | L3 |
Die Anweisung wurde ohne Fehler ausgeführt, jedoch hat sie nur die erste Zeile geändert. Die zweite und dritte Zeile sind für Jenni nicht lesbar, sodass sie nicht für die Aktualisierung durch die Anweisung ausgewählt wurden, obwohl sie die Bedingung der WHERE-Klausel erfüllen.
Beachten Sie, dass der Wert der Spalte LABEL in der aktualisierten Zeile geändert wurde, obwohl diese Spalte in der UPDATE-Anweisung nicht explizit angegeben war. Die Spalte wurde auf den Sicherheitskennsatz gesetzt, den Jenni für den Schreibzugriff besaß.
Nehmen Sie jetzt an, dass Jenni LBAC-Berechtigungsnachweise für den Lesezugriff auf Daten erteilt werden, die durch einen beliebigen Sicherheitskennsatz geschützt werden. Ihre LBAC-Berechtigungsnachweise für den Schreibzugriff werden nicht geändert. Sie kann auch weiterhin nur Daten schreiben, die durch die Sicherheitskennsätze L0 und L1 geschützt werden.
UPDATE T1 SET DEPTNO = 44 WHERE DEPTNO = 11Diesmal schlägt die Aktualisierung wegen der zweiten und der dritten Zeile fehl. Jenni kann diese Zeilen lesen, sodass sie für die Aktualisierung durch die Anweisung ausgewählt werden. Sie ist jedoch nicht berechtigt, in diese Zeilen zu schreiben, weil sie durch die Sicherheitskennsätze L2 und L3 geschützt werden. Die Aktualisierung findet nicht statt, und es wird ein Fehler zurückgegeben.
Jenni setzt nun die folgende SQL-Anweisung ab:
UPDATE T1
SET DEPTNO = 55, LABEL = SECLABEL_BY_NAME( 'P1', 'L2' )
WHERE LASTNAME = "Rjaibi" Die Funktion SECLABEL_BY_NAME in der Anweisung gibt den Sicherheitskennsatz mit dem Namen L2 zurück. Jenni versucht, den Sicherheitskennsatz, der die erste Zeile schützt, explizit festzulegen. Jennis LBAC-Berechtigungsnachweise erlauben ihr, die erste Zeile zu lesen, sodass diese für die Aktualisierung ausgewählt wird. Ihre LBAC-Berechtigungsnachweise erlauben ihr einen Schreibzugriff auf Zeilen, die durch den Sicherheitskennsatz L0 geschützt werden, sodass sie die Zeile aktualisieren darf. Allerdings würden ihre LBAC-Berechtigungsnachweise ihr keinen Schreibzugriff auf eine Zeile erlauben, die durch den Sicherheitskennsatz L2 geschützt wird. Daher ist sie nicht berechtigt, die Spalte LABEL auf diesen Wert zu setzen. Die Ausführung der Anweisung schlägt unter Rückgabe eines Fehlers fehl. Es werden keine Spalten in der Zeile aktualisiert.
Jenni setzt nun die folgende SQL-Anweisung ab:
UPDATE T1 SET LABEL = SECLABEL_BY_NAME( 'P1', 'L1' ) WHERE LASTNAME = "Rjaibi" Die Anweisung wird erfolgreich ausgeführt, weil sie in eine Zeile schreiben könnte, die durch den Sicherheitskennsatz L1 geschützt wird.
| EMPNO | LASTNAME | DEPTNO | ETIQUETTE |
|---|---|---|---|
| 1 | Rjaibi | 44 | L1 |
| 2 | Miller | 11 | L2 |
| 3 | Bird | 11 | L3 |
Aktualisieren geschützter Zeilen, die geschützte Spalten enthalten
Wenn Sie versuchen, geschützte Spalten in einer Tabelle mit geschützten Zeilen zu aktualisieren, müssen Ihre LBAC-Berechtigungsnachweise einen Schreibzugriff auf alle geschützten Spalten zulassen, die von der Aktualisierung betroffen sind. Ansonsten schlägt die Aktualisierung fehl und ein Fehler wird zurückgegeben. Dieser Sachverhalt wird im vorausgehenden Abschnitt über das Aktualisieren geschützter Spalten beschrieben. Wenn Sie berechtigt sind, alle geschützten Spalten, die von der Aktualisierung betroffen sind, zu aktualisieren, können Sie trotzdem nur die Zeilen aktualisieren, auf die Ihnen Ihre LBAC-Berechtigungsnachweise sowohl einen Lesezugriff als auch einen Schreibzugriff ermöglichen. Dieser Sachverhalt wird im vorausgehenden Abschnitt über das Aktualisieren geschützter Zeilen beschrieben. Die Behandlung einer Spalte mit dem Datentyp DB2SECURITYLABEL bleibt gleich, unabhängig davon, ob die Aktualisierung geschützte Spalten betrifft oder nicht.
Wenn die Spalte, die den Datentyp DB2SECURITYLABEL hat, selbst eine geschützte Spalte ist, müssen Ihre LBAC-Berechtigungsnachweise einen Schreibzugriff auf diese Spalte zulassen. Ansonsten können Sie keine der Zeilen in der Tabelle aktualisieren.