Benutzer-Werkzeuge

Webseiten-Werkzeuge


engine:procedures:mi_modifyprocexrestforgroup_ad

mi_ModifyProcExRestForGroup_Ad

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 :

  • „number“ :

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 :

  • „>“
  • „>=“
  • „<“
  • „⇐“
  • „<>“
  • „=“
  • „IN“ (AUSNAHME : „Condition“ besteht aus mehreren Werten, durch „,“ getrennt; diese einzelnen Werte werden in einen „decimal(30,10)“-Wert konvertiert und mit dem angegebenen Wert anhand des „=“-Operators verglichen. Sobald einer der Vergleiche positiv ist, gilt die Bedingung als erfüllt !)
  • „NOT IN“ (AUSNAHME : Wie „IN“, nur mit dem Unterschied, daß sobald einer der Vergleiche positiv ist, die Bedingung NICHT erfüllt ist !)
  • „IS NULL“ („Condition“ wird in diesem Fall nicht beachtet)
  • „IS NOT NULL“ („Condition“ wird in diesem Fall nicht beachtet)
  • „string“ : Der angegebene Wert und der Bedingungswert („Condition“) werden „so wie sie sind“, d.h. als „strings“ (genauer, „varchar(255)“) verglichen. Mögliche Vergleichs-Operatoren :
  • „=“
  • „<>“
  • „LIKE“
  • „NOT LIKE“
  • „IN“ („Condition“ muß eine Liste von „string“-Werten sein, die durch „,“ voneinander zu trennen sind. Die einzelnen Werte werden dann mit dem angegebenen Wert anhand des „=“-Operators verglichen. Sobald einer der Vergleiche positiv ist, gilt die Bedingung als erfüllt !)
  • „NOT IN“ (Wie „IN“, nur mit dem Unterschied, daß sobald einer der Vergleiche positiv ist, die Bedingung NICHT erfüllt ist !)
  • „IS NULL“ („Condition“ wird in diesem Fall nicht beachtet)
  • „IS NOT NULL“ („Condition“ wird in diesem Fall nicht beachtet)
  • „datetime“ : Der angegebene Wert und der Bedingungswert („Condition“) werden jeweils in einen „datetime“-Wert konvertiert; diese beiden Werte werden dann anhand eines der folgenden Operatoren verglichen :
  • „>“ (BESONDERHEIT : In diesem Fall darf „Condition = getdate()“ sein. Somit kann man prüfen, ob ein Datumswert in der ZUKUNFT liegt.)
  • „>=“
  • „<“ (BESONDERHEIT : In diesem Fall darf „Condition = getdate()“ sein. Somit kann man prüfen, ob ein Datumswert in der VERGANGENHEIT liegt.)
  • „⇐“
  • „<>“
  • „=“
  • „IN“ (AUSNAHME : „Condition“ besteht aus mehreren Werten, durch „,“ getrennt; diese einzelnen Werte werden in einen „datetime“-Wert konvertiert und mit dem angegebenen Wert anhand des „=“-Operators verglichen. Sobald einer der Vergleiche positiv ist, gilt die Bedingung als erfüllt !)
  • „NOT IN“ (AUSNAHME : Wie „IN“, nur mit dem Unterschied, daß sobald einer der Vergleiche positiv ist, die Bedingung NICHT erfüllt ist !)
  • „LIKE“ (AUSNAHME : Verglichen werden die „string“-Werte)
  • „NOT LIKE“ (AUSNAHME : Verglichen werden die „string“-Werte)
  • „IS NULL“ („Condition“ wird in diesem Fall nicht beachtet)
  • „IS NOT NULL“ („Condition“ wird in diesem Fall nicht beachtet)
HTTP-MethodPOST
HTTP-AuthOptional
Aliasmi_ModifyProcedureExecutionRestrictionsForGroups_Ad
Tags
Engine-Kategorieconfigurations
Engine-TypDaten-Änderung
Letzte Aktualisierung7.0.7 (2015-01-29)

Parameter

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)
smallint5.0.0
RestrictionForUserGroupID1 ID einer User-Gruppe (mögliche Werte : siehe mi_GetUserGroups_Ad) für die die Beschränkung gilt
smallint5.0.0
FromNestingLevel1 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“)
tinyint5.0.0
ConditionID1 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“)
tinyint5.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
ConditionNumber1 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…)
tinyint5.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
RestrictionIsActive0 „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
bit5.0.0
SetRestrictionIsActiveOnly0 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.
tinyint5.0.0
Delete0 Wird nur beachtet, wenn Werte zwischen „1“ und „6“ angegeben werden ! Die Bedeutung der einzelnen Werte ist der Beschreibung zu entnehmen.
tinyint5.0.0

Rückgabe

Die Prozedur hat keine Rückgaben.

Output-Parameter

Die Prozedur hat keine Output-Parameter.

Mögliche Return-Codes

Code Beschreibung Quelle 4)
-569Der Benutzer hat kein Ausführungsrecht für die Prozedurnur indirekt
-568Der Datentyp des Parameters wird nicht unterstütztnur direkt
-567Die Prozedur darf z. Zt. nicht ausgeführt werdennur indirekt
-566Die Prozedur darf mit den übergebenen Parametern nicht ausgeführt werdennur indirekt
-535Das Datum liegt nicht in der Vergangenheitnur indirekt
-530Der Wert ist nicht konvertierbarnur indirekt
-510Der Benutzer ist nicht registriertnur indirekt
-504Es ist ein Problem aufgetreten, das nicht gelöst werden kann, Prozedur wird daher abgebrochennur indirekt
-502Die Parameter-Werte der Prozedur können nicht verarbeitet werden (kein passendes Trennzeichen)nur indirekt
-500Falsche Parameterdirekt und indirekt

XML-Schema

Die Rückgabe erfolgt als XML-Dokument welches gegen das Schema Response/EngineProcedure_v1_0.xsd validiert.

Historie

7.0.7 2015-01-29Interne Änderung : Datentyp-Erweiterung des „ReferenceKey“ [für „_mi_StartProcedure“-Aufruf]
6.5.4 2013-04-29An einigen Stellen eine „-500“-PrintMessage ergänzt
6.5.3 2013-03-18Anpassungen an aktuellen Code-Standard, u.a. wg. UTF8-Unterstützung
6.0.0 2010-03-261. 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-26Kleine interne Änderungen
5.0.0 2004-12-21Erstmalig in dieser Version erstellt

Code-Snippets

Engine Playground

Der folgende Link öffnet in einem separaten Fenster den Engine Playground der fest mit dem dbap-demo System verbunden ist:

cURL

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 -
dStore_php
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();
engine/execute

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>
1)
Pflichtparameter sind unterstrichen
4)
direkt meint „von der Prozedur selber“ und indirekt meint „von intern aufgerufenen Unterprozeduren“
5)
I.d.R. auf Unix-artigen Systemen bereits installiert, Bestandteil der libxml2, siehe http://www.xmlsoft.org
engine/procedures/mi_modifyprocexrestforgroup_ad.txt · Zuletzt geändert: 11.01.2016 (Externe Bearbeitung)