Für registrierte Prozeduren, zu denen „CheckForExecutionRestrictions“ den Wert „2“ hat (siehe mi_GetRegisteredProcedures_Ad), wird bei jedem Aufruf überprüft, ob es Einschränkungen hinsichtlich der Parameter-Werte für den Benutzer, der die Prozedur ausführen möchte, gibt.
Solche Einschränkungen sind in der Tabelle „ProcExecRestrictsForUsers“ (pro Benutzer) und in der Tabelle „ProcExecRestrictsForGroups“ (pro Benutzer-Gruppe) hinterlegt und können mit Hilfe dieser Prozedur bzw. mit mi_ModifyProcExRestForUser_Ad konfiguriert werden.
Anmerkung zum Parameter „Delete“ :
Mögliche Werte für diesen Parameter sind…
„1“ : Die Bedingung zur „ProcedureID“, „RestrictionForUserGroupID“, „FromNestingLevel“, „ConditionID“, „ParameterName“ und „ConditionNumber“ wird gelöscht
„2“ : Alle Bedingungen zur „ProcedureID“, „RestrictionForUserGroupID“, „FromNestingLevel“, „ConditionID“ und „ParameterName“ werden gelöscht
„3“ : Alle Bedingungen zur „ProcedureID“, „RestrictionForUserGroupID“, „FromNestingLevel“ und „ConditionID“ werden gelöscht
„4“ : Alle Bedingungen zur „ProcedureID“, „RestrictionForUserGroupID“ und „FromNestingLevel“ werden gelöscht
„5“ : Alle Bedingungen zur „ProcedureID“ und „RestrictionForUserGroupID“ werden gelöscht
„6“ : Alle Bedingungen zur „ProcedureID“ werden gelöscht
(sonst : Der Parameter hat keine Bedeutung)
Anmerkung zum Parameter „SetRestrictionIsActiveOnly“ :
Mögliche Werte für diesen Parameter sind…
„1“ : Für die Bedingung zur „ProcedureID“, „RestrictionForUserGroupID“, „FromNestingLevel“, „ConditionID“, „ParameterName“ und „ConditionNumber“ wird „RestrictionIsActive“ (dem gleichnamigen Parameter entsprechend) gesetzt
„2“ : Für alle Bedingungen zur „ProcedureID“, „RestrictionForUserGroupID“, „FromNestingLevel“, „ConditionID“ und „ParameterName“ wird „RestrictionIsActive“ (dem gleichnamigen Parameter entsprechend) gesetzt
„3“ : Für alle Bedingungen zur „ProcedureID“, „RestrictionForUserGroupID“, „FromNestingLevel“ und „ConditionID“ wird „RestrictionIsActive“ (dem gleichnamigen Parameter entsprechend) gesetzt
„4“ : Für alle Bedingungen zur „ProcedureID“, „RestrictionForUserGroupID“ und „FromNestingLevel“ wird „RestrictionIsActive“ (dem gleichnamigen Parameter entsprechend) gesetzt
„5“ : Für alle Bedingungen zur „ProcedureID“ und „RestrictionForUserGroupID“ wird „RestrictionIsActive“ (dem gleichnamigen Parameter entsprechend) gesetzt
„6“ : Für alle Bedingungen zur „ProcedureID“ wird „RestrictionIsActive“ (dem gleichnamigen Parameter entsprechend) gesetzt
(sonst : Der Parameter hat keine Bedeutung)
Hier der Algorithmus der Überprüfung anhand der Tabelle „ProcExecRestrictsForUsers“ bzw. „ProcExecRestrictsForGroups“ :
1.
Es gibt eine sogenannte „KILLER“-Einschränkung, die als erstes geprüft wird :
Wenn in „ProcExecRestrictsForUsers“ zur Prozedur für den Benutzer mit der ID „-1“ (also „Global“) zur „FromNestingLevel = 0“ wenigstens ein aktiver (also „RestrictionIsActive = 1“) Datensatz vorhanden ist, dann wird IMMER (egal was noch für Einschränkungen konfiguriert sind) „-567“ zurückgegeben, d.h. die Prozedur kann von niemandem mehr ausgeführt werden !
Hinweis : Diese Einschränkung kann nicht geändert werden, sie darf lediglich aktiviert oder deaktiviert werden. Wird eine Prozedur im „dStore“ registriert (mit Hilfe der Prozedur mi_ModifyRegisteredProcs_Ad), wird automatisch ein entsprechender Datensatz in „ProcExecRestrictsForUsers“ eingetragen (natürlich ist die „KILLER“-Einschränkung per default deaktiviert…) !
2.
(i) Ist keine grundsätzliche Einschränkung (wie in 1. beschrieben) konfiguriert, ermitteln wir (aus „ProcExecRestrictsForUsers“) für die Prozedur zum Benutzer, der die Prozedur aufruft, den größten „FromNestingLevel“-Wert, der aber kleiner als (oder gleich) der (dem) „Ausführungs-NestingLevel“ sein muß.
Hinweis : Ein „Ausführungs-NestingLevel“ von „1“ bedeutet, daß die Prozedur direkt aufgerufen wird, „2“ heißt, daß sie innerhalb einer anderen Prozedur aufgerufen wird, ein Wert von „3“ gibt an, daß sie in einer Prozedur aufgerufen wird, die wiederum in einer anderen Prozedur ausgeführt wird, usw.
(ii) Konnte wie in (i) geschildert kein Wert ermittelt werden, gehen wir die Gruppen, denen der Benutzer, der die Prozedur aufruft, zugeordnet ist, der „Reihe“ (sprich der „SortNo“ aus „UsersInGroups“ aufsteigend) nach durch, und ermitteln jeweils den größten „FromNestingLevel“-Wert (aus „ProcExecRestrictsForGroups“), der aber kleiner als (oder gleich) der (dem) „Ausführungs-NestingLevel“ ist. Die Einschränkungen zur ersten Gruppe, die wir finden, werden dann (wie unten in 3. beschrieben) überprüft.
(iii) Gibt es keine Gruppe (in die der Benutzer eingeordnet ist) in „ProcExecRestrictsForGroups“ mit passendem „FromNestingLevel“-Wert, versuchen wir das gleiche wie in (i), nur zur „UserID = -1“ (der „globale Benutzer“).
Allgemeiner Hinweis : Hintergrund der Spalte „FromNestingLevel“ ist die Tatsache, daß man im Regelfall nur eine Einschränkung der Parameter überprüfen lassen muß, wenn die Prozedur DIREKT aufgerufen wird. Ein Aufruf innerhalb einer anderen Prozedur bedeutet oftmals, daß in dieser Prozedur schon bestimmte Checks gemacht wurden bzw. sowieso immer nur sehr spezielle Parameter-Werte verwendet werden.
Man wird gewünschte Einschränkungen normalerweise immer zur „FromNestingLevel = 1“ vornehmen. Soll die Überprüfung im Falle eines Aufrufs der Prozedur aus einer anderen Prozedur heraus nun immer positiv (und auch performant) verlaufen, konfiguriert man zur „FromNestingLevel = 2“ eine „pseudo“-Einschränkung : man fügt eine einzige Bedingung ein, und zwar zu irgendeinem Parameter, für den alle möglichen Werte erlaubt sind !
3.
Konnten wir im Schritt „2“ ein „FromNestingLevel“-Wert ermitteln, werden nun die Bedingungen überprüft :
Bedingungen zur gleichen „ConditionID“ werden mit „AND“ verknüpft, die „Bedingungsblöcke“ („ConditionID“s) mit „OR“. Grundsätzlich gilt : Es müssen ALLE Bedingungen wenigstens EINER „ConditionID“ erfüllt sein. Sind alle „ConditionID“s abgearbeitet, aber bei keiner waren alle Bedingungen erfüllt, gibt es den Fehler „-566“.
Je nach „Basis“-Typ eines Parameters wird eine einzelne Bedingung wie folgt ausgewertet :
Der angegebene Wert und der Bedingungswert („Condition“) werden jeweils in einen „decimal(30,10)“-Wert konvertiert; diese beiden Werte werden dann anhand eines der folgenden Operatoren verglichen :
HTTP-Method | POST |
HTTP-Auth | Optional |
Alias | mi_ModifyProcedureExecutionRestrictionsForGroups_Ad |
Tags | |
Engine-Kategorie | configurations |
Engine-Typ | Daten-Änderung |
Letzte Aktualisierung | 7.0.7 (2015-01-29) |
Name 1) | Standard-Wert | Beschreibung 2) | SQL-Datentyp3) | ab Version |
---|---|---|---|---|
ProcedureID | ID einer registrierten Prozedur für die Beschränkungen konfiguriert oder gelöscht werden sollen. (Mögliche Werte : siehe mi_GetRegisteredProcedures_Ad) | smallint | 5.0.0 | |
RestrictionForUserGroupID | 1 | ID einer User-Gruppe (mögliche Werte : siehe mi_GetUserGroups_Ad) für die die Beschränkung gilt | smallint | 5.0.0 |
FromNestingLevel | 1 | Ab welchem „Ausführungs-NestingLevel“ („1“ : direkter Aufruf der Prozedur, „2“ Aufruf aus einer Prozedur heraus, usw.) gilt die Beschränkung. ACHTUNG : „0“ ist (Ausnahme : „KILLER“-Einschränkung) VERBOTEN ! („-500“) | tinyint | 5.0.0 |
ConditionID | 1 | Nummer (willkürliche Zahl) eines „Bedingungsblocks“, zu dem die Beschränkung gehört - Bedingungen zur gleichen „ConditionID“ werden mit „AND“ verknüpft, die „Bedingungsblöcke“ mit „OR“. ACHTUNG : „0“ ist VERBOTEN ! („-500“) | tinyint | 5.0.0 |
ParameterName | Name eines Parameters der durch „ProcedureID“ angegebenen Prozedur. Der Wert zu diesem Parameter wird beim Aufruf der Prozedur anhand des durch „Operator“ angegebenen Operators mit „Condition“ verglichen. | varchar(50) | 5.0.0 | |
ConditionNumber | 1 | Um die wievielte Bedingung (sprich Einschränkung) innerhalb des Bedingungs-Blocks „ConditionID“ handelt es sich ? (Im Prinzip eine willkürliche Zahl, die eigentlich nur dazu dient, den Datensatz in der Tabelle, also die Bedingung, EINDEUTIG zu machen…) | tinyint | 5.0.0 |
Operator | Gibt an, wie der Parameter-Wert mit „Condition“ verglichen wird. Mögliche Werte : siehe Erläuterung des Überprüfungs-Algorithmus in der Beschreibung. | varchar(20) | 5.0.0 | |
Condition | Die eigentliche Beschränkung/Bedingung (s.a. Erläuterung des Überprüfungs-Algorithmus in der Beschreibung) | varchar(255) | 5.0.0 | |
RestrictionIsActive | 0 | „0“ : Die Beschränkung ist zwar konfiguriert, aber nicht aktiv, d.h. wird bei der Ausführung der Prozedur NICHT beachtet „1“ : Die Beschränkung ist aktiv | bit | 5.0.0 |
SetRestrictionIsActiveOnly | 0 | Dieser Parameter hat nur Bedeutung, wenn „Delete“ nicht beachtet wird ! Sofern nicht Werte zwischen „1“ und „6“ (Bedeutung : s. Beschreibung) übergeben werden, wird der Parameter nicht berücksichtigt. | tinyint | 5.0.0 |
Delete | 0 | Wird nur beachtet, wenn Werte zwischen „1“ und „6“ angegeben werden ! Die Bedeutung der einzelnen Werte ist der Beschreibung zu entnehmen. | tinyint | 5.0.0 |
Die Prozedur hat keine Rückgaben.
Die Prozedur hat keine Output-Parameter.
Code | Beschreibung | Quelle 4) |
---|---|---|
-569 | Der Benutzer hat kein Ausführungsrecht für die Prozedur | nur indirekt |
-568 | Der Datentyp des Parameters wird nicht unterstützt | nur direkt |
-567 | Die Prozedur darf z. Zt. nicht ausgeführt werden | nur indirekt |
-566 | Die Prozedur darf mit den übergebenen Parametern nicht ausgeführt werden | nur indirekt |
-535 | Das Datum liegt nicht in der Vergangenheit | nur indirekt |
-530 | Der Wert ist nicht konvertierbar | nur indirekt |
-510 | Der Benutzer ist nicht registriert | nur indirekt |
-504 | Es ist ein Problem aufgetreten, das nicht gelöst werden kann, Prozedur wird daher abgebrochen | nur indirekt |
-502 | Die Parameter-Werte der Prozedur können nicht verarbeitet werden (kein passendes Trennzeichen) | nur indirekt |
-500 | Falsche Parameter | direkt und indirekt |
Die Rückgabe erfolgt als XML-Dokument welches gegen das Schema Response/EngineProcedure_v1_0.xsd validiert.
7.0.7 | 2015-01-29 | Interne Änderung : Datentyp-Erweiterung des „ReferenceKey“ [für „_mi_StartProcedure“-Aufruf] |
6.5.4 | 2013-04-29 | An einigen Stellen eine „-500“-PrintMessage ergänzt |
6.5.3 | 2013-03-18 | Anpassungen an aktuellen Code-Standard, u.a. wg. UTF8-Unterstützung |
6.0.0 | 2010-03-26 | 1. Der Default-Wert für „RestrictionForUserGroupID“ war unsinnig [⇒ von „-1“ auf „1“ geändert] 2. Anpassung des Quell-Codes an den aktuellen Standard |
5.0.4 | 2005-09-26 | Kleine interne Änderungen |
5.0.0 | 2004-12-21 | Erstmalig in dieser Version erstellt |
Der folgende Link öffnet in einem separaten Fenster den Engine Playground der fest mit dem dbap-demo System verbunden ist:
Unformatierte Ausgabe:
curl -X POST 'http://<partner>-<project>.dstore.de/default/engine/mi_ModifyProcExRestForGroup_Ad?ProcedureID=<value>&ParameterName=<value>&Operator=<value>&Condition=<value>'
Mit xmllint 5) formatierte Ausgabe:
curl -X POST 'http://<partner>-<project>.dstore.de/default/engine/mi_ModifyProcExRestForGroup_Ad?ProcedureID=<value>&ParameterName=<value>&Operator=<value>&Condition=<value>' | xmllint --format -
use dStore_php\WebService; $service = new WebService\Service( WebService\Scheme::HTTP,'<partner>-<project>.dstore.de', 80); $request = new WebService\Requests\Engine\Procedure\Request( new WebService\Requests\AccessData('default'), 'mi_ModifyProcExRestForGroup_Ad', array( 'ProcedureID' => <value>, 'ParameterName' => '<value>', 'Operator' => '<value>', 'Condition' => '<value>', // 'RestrictionForUserGroupID' => 1, // 'FromNestingLevel' => 1, // 'ConditionID' => 1, // 'ConditionNumber' => 1, // 'RestrictionIsActive' => 0, // 'SetRestrictionIsActiveOnly' => 0, // 'Delete' => 0 ) ); $service->execute($request); $xml_result = $request->getResponse()->getBody()->toSimpleXmlDocument(); $ResultSet = $xml_result->getRowsAsArray();
XML zur Ausführung mit der Methode engine/execute, z.B. per
curl --header 'Content-Type: application/xml' -X POST 'http://<partner>-<kunde>.dstore.de/default/engine/execute' -d '<xml-daten>'
<?xml version="1.0" encoding="UTF-8"?> <ListOfBatches> <Batch No="0"> <Procedure Name="mi_ModifyProcExRestForGroup_Ad"> <Parameters> <Parameter Name="ProcedureID"><!-- smallint value --></Parameter> <Parameter Name="ParameterName"><!-- varchar value --></Parameter> <Parameter Name="Operator"><!-- varchar value --></Parameter> <Parameter Name="Condition"><!-- varchar value --></Parameter> <!-- <Parameter Name="RestrictionForUserGroupID">1</Parameter> --> <!-- <Parameter Name="FromNestingLevel">1</Parameter> --> <!-- <Parameter Name="ConditionID">1</Parameter> --> <!-- <Parameter Name="ConditionNumber">1</Parameter> --> <!-- <Parameter Name="RestrictionIsActive">0</Parameter> --> <!-- <Parameter Name="SetRestrictionIsActiveOnly">0</Parameter> --> <!-- <Parameter Name="Delete">0</Parameter> --> </Parameters> </Procedure> </Batch> </ListOfBatches>