The ABNF grammar
TriggerSpecification = ActionTime TriggerEventAndTriggeredAction ActionTime = "BEFORE" / "AFTER" / "INSTEADOF" TriggerEventAndTriggeredAction = LDAPOperationAndStoredProcedureCall LDAPOperationAndStoredProcedureCall = BindOperationAndStoredProcedureCall / UnbindOperationAndStoredProcedureCall / SearchOperationAndStoredProcedureCall / ModifyOperationAndStoredProcedureCall / AddOperationAndStoredProcedureCall / DeleteOperationAndStoredProcedureCall / ModDNOperationAndStoredProcedureCall / CompareOperationAndStoredProcedureCall / AbandonOperationAndStoredProcedureCall / ExtendedOperationAndStoredProcedureCall BindOperationAndStoredProcedureCall = "bind" "CALL" FullyQualifiedStoredProcedureName [ GenericStoredProcedureOptionList ] [ BindStoredProcedureParameterList ] UnbindOperationAndStoredProcedureCall = "unbind" "CALL" FullyQualifiedStoredProcedureName [ GenericStoredProcedureOptionList ] [ UnbindStoredProcedureParameterList ] SearchOperationAndStoredProcedureCall = "search" "CALL" FullyQualifiedStoredProcedureName [ GenericStoredProcedureOptionList ] [ SearchStoredProcedureParameterList ] ModifyOperationAndStoredProcedureCall = "modify" "CALL" FullyQualifiedStoredProcedureName [ GenericStoredProcedureOptionList ] [ ModifyStoredProcedureParameterList ] AddOperationAndStoredProcedureCall = "add" "CALL" FullyQualifiedStoredProcedureName [ GenericStoredProcedureOptionList ] [ AddStoredProcedureParameterList ] DeleteOperationAndStoredProcedureCall = "delete" "CALL" FullyQualifiedStoredProcedureName [ GenericStoredProcedureOptionList ] [ DeleteStoredProcedureParameterList ] ModDNOperationAndStoredProcedureCall = "modDN" "CALL" FullyQualifiedStoredProcedureName [ GenericStoredProcedureOptionList ] [ ModDNStoredProcedureParameterList ] CompareOperationAndStoredProcedureCall = "compare" "CALL" FullyQualifiedStoredProcedureName [ GenericStoredProcedureOptionList ] [ CompareStoredProcedureParameterList ] AbandonOperationAndStoredProcedureCall = "abandon" "CALL" FullyQualifiedStoredProcedureName [ GenericStoredProcedureOptionList ] [ AbandonStoredProcedureParameterList ] ExtendedOperationAndStoredProcedureCall = "extended" "CALL" FullyQualifiedStoredProcedureName [ GenericStoredProcedureOptionList ] [ ExtendedStoredProcedureParameterList ] BindStoredProcedureParameterList = "(" *( BindStoredProcedureParameter *( sep BindStoredProcedureParameter ) ) ")" UnbindStoredProcedureParameterList = "(" *( UnbindStoredProcedureParameter *( sep UnbindStoredProcedureParameter ) ) ")" SearchStoredProcedureParameterList = "(" *( SearchStoredProcedureParameter *( sep SearchStoredProcedureParameter ) ) ")" ModifyStoredProcedureParameterList = "(" *( ModifyStoredProcedureParameter *( sep ModifyStoredProcedureParameter ) ) ")" AddStoredProcedureParameterList = "(" *( AddStoredProcedureParameter *( sep AddStoredProcedureParameter ) ) ")" DeleteStoredProcedureParameterList = "(" *( DeleteStoredProcedureParameter *( sep DelStoredProcedureParameter ) ) ")" ModDNStoredProcedureParameterList = "(" *( ModDNStoredProcedureParameter *( sep ModDNStoredProcedureParameter ) ) ")" CompareStoredProcedureParameterList = "(" *( CompareStoredProcedureParameter *( sep CompareStoredProcedureParameter ) ) ")" AbandonStoredProcedureParameterList = "(" *( AbandonStoredProcedureParameter *( sep AbandonStoredProcedureParameter ) ) ")" ExtendedStoredProcedureParameterList = "(" *( ExtendedStoredProcedureParameter *( sep ExtendedStoredProcedureParameter ) ) ")" BindStoredProcedureParameter = "$version" / "$name" / "$authentication" / GenericStoredProcedureParameter UnbindStoredProcedureParameter = GenericStoredProcedureParameter SearchStoredProcedureParameter = "$baseObject" / "$scope" / "$derefAliases" / "$sizeLimit" / "$timeLimit" / "$typesOnly" / "$filter" / "$attributes" / "$searchResults" / GenericStoredProcedureParameter ModifyStoredProcedureParameter = "$object" / "$modification" / GenericStoredProcedureParameter / "$oldEntry" / "$newEntry" AddStoredProcedureParameter = "$entry" / "$attributes" / GenericStoredProcedureParameter DeleteStoredProcedureParameter = "$name" / GenericStoredProcedureParameter / "$deletedEntry" ModDNStoredProcedureParameter = "$entry" / "$newrdn" / "$deleteoldrdn" / "$newSuperior" / GenericStoredProcedureParameter CompareStoredProcedureParameter = "$entry" / "$ava" / "$compareResult" / GenericStoredProcedureParameter AbandonStoredProcedureParameter = "$messageId" / GenericStoredProcedureParameter ExtendedStoredProcedureParameter = "$requestName" / "$requestValue" / GenericStoredProcedureParameter GenericStoredProcedureParameter = "$operationPrincipal" / "$operationTime" FullyQualifiedStoredProcedureName = UTF8String GenericStoredProcedureOptionList = "{" *( GenericStoredProcedureOption *( sep GenericStoredProcedureOption ) ) "}" GenericStoredProcedureOption = StoredProcedureLanguageOption / StoredProcedureSearchContextOption StoredProcedureLanguageOption = "language" StoredProcedureLanguage StoredProcedureLanguage = UTF8String StoredProcedureSearchContextOption = "searchContext" [ "{" [ "scope" StoredProcedureSearchScope ] "}" ] StoredProcedureSearchContext StoredProcedureSearchScope = "baseObject" / "singleLevel" / "wholeSubtree" StoredProcedureSearchContext = DistinguishedName sep = "," ; All characters after # in a line are considered to be comments.
A LL(1) equivalent of this grammar can be found here (draft).
Examples
BEFORE delete CALL "BackupUtilities.backupDeletedEntry" ($name, $deletedEntry)
AFTER add CALL "Logger.logAddOperation" ($entry, $attributes, $operationPrincipal)
INSTEADOF search # do not do search CALL "RestrictionUtilities.searchNoWay" { language "Java" } () # but run a procedure
BEFORE bind # Action Time and Operation CALL "AuthUtilities.beforeBind" # Stored Procedure Call { searchContext { scope baseObject } "cn=Auth,cn=System Stored Procedures,ou=system" } # Stored Procedure Call Options ($name) # Stored Procedure Parameter(s)
Ideas
- We may add a runAs option for stored procedure call. Can this be related to RFC 4370 (Lightweight Directory Access Protocol (LDAP) Proxied Authorization Control)
?
References
- RFC 2251
Lightweight Directory Access Protocol (v3) - RFC 2234
Augmented BNF for Syntax Specifications: ABNF - RFC 3642
Common Elements of Generic String Encoding Rules (GSER) Encodings - ANSI/ISO/IEC 9075-2:1999
ANSI/ISO/IEC International Standard (IS), Database Language SQL — Part 2: Foundation (SQL/Foundation)
