Format i składnia warunków przypisania roli platformy Azure
Warunek to dodatkowy element kontroli, który można opcjonalnie dodać do przypisania roli w celu zapewnienia bardziej precyzyjnej kontroli dostępu. Można na przykład dodać warunek, który wymaga, aby obiekt miał określony tag do odczytania obiektu. W tym artykule opisano format i składnię warunków przypisania roli.
Format warunku
Aby lepiej zrozumieć warunki przypisywania ról, warto przyjrzeć się formatowi.
Prosty warunek
Najbardziej podstawowy warunek składa się z akcji docelowej i wyrażenia. Akcja to operacja, którą użytkownik może wykonać na typie zasobu. Wyrażenie jest instrukcją, która oblicza wartość true lub false, która określa, czy można wykonać akcję.
Poniżej przedstawiono format prostego warunku.
(
(
!(ActionMatches{'<action>'})
)
OR
(
<attribute> <operator> <value>
)
)
Poniższy warunek ma akcję "Odczytaj obiekt blob". Wyrażenie sprawdza, czy nazwa kontenera to blobs-example-container.
(
(
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'})
)
OR
(
@Resource[Microsoft.Storage/storageAccounts/blobServices/containers:name]
StringEquals 'blobs-example-container'
)
)
Jak jest obliczany warunek
Jeśli użytkownik spróbuje wykonać akcję w przypisaniu roli, która nie <action>
jest wartością , zwraca wartość true, !(ActionMatches)
a ogólny warunek daje wartość true, aby umożliwić wykonanie akcji.
Jeśli użytkownik próbuje wykonać zadanie <action>
w przypisaniu roli, !(ActionMatches)
daje wartość false, więc wyrażenie jest oceniane. Jeśli wyrażenie zwróci wartość true, ogólny warunek daje wartość true, aby umożliwić <action>
wykonywanie. <action>
W przeciwnym razie nie można wykonać.
Poniższy pseudo kod pokazuje inny sposób, w jaki można odczytać ten warunek.
if a user tries to perform an action in the role assignment that does not match <action>
{
Allow action to be performed
}
else
{
if <attribute> <operator> <value> is true
{
Allow <action> to be performed
}
else
{
Do not allow <action> to be performed
}
}
Podoperacje
Niektóre akcje mają podoperacje. Na przykład akcja Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read
danych ma podoperację "Wyświetlanie listy obiektów blob". Warunki z podoperacjami mają następujący format.
(
(
!(ActionMatches{'<action>'}
AND
SubOperationMatches{'<subOperation>'})
)
OR
(
<attribute> <operator> <value>
)
)
Wiele akcji
Warunek może zawierać wiele akcji, które chcesz zezwolić, jeśli warunek ma wartość true. Jeśli wybierzesz wiele akcji dla jednego warunku, może istnieć mniej atrybutów do wyboru dla warunku, ponieważ atrybuty muszą być dostępne w wybranych akcjach.
(
(
!(ActionMatches{'<action>'})
AND
!(ActionMatches{'<action>'})
)
OR
(
<attribute> <operator> <value>
)
)
Wiele wyrażeń
Warunek może zawierać wiele wyrażeń. W zależności od operatora atrybuty mogą być sprawdzane względem wielu wartości.
(
(
!(ActionMatches{'<action>'})
)
OR
(
<attribute> <operator> <value>
AND | OR
<attribute> <operator> {<value>, <value>, <value>}
AND | OR
<attribute> <operator> <value>
)
)
Wiele warunków
Można również połączyć warunki w celu kierowania wielu akcji.
(
(
!(ActionMatches{'<action>'})
)
OR
(
<attribute> <operator> <value>
AND | OR
<attribute> <operator> {<value>, <value>, <value>}
AND | OR
<attribute> <operator> <value>
)
)
AND
(
(
!(ActionMatches{'<action>'})
)
OR
(
<attribute> <operator> <value>
AND | OR
<attribute> <operator> <value>
)
)
Składnia warunku
Poniżej przedstawiono składnię warunku przypisania roli.
(
(
!(ActionMatches{'<action>'} AND SubOperationMatches{'<subOperation>'})
AND
!(ActionMatches{'<action>'} AND SubOperationMatches{'<subOperation>'})
AND
...
)
OR
(
<attribute> <operator> {<value, <value>, ...}
AND | OR
<attribute> <operator> {<value>, <value>, ...}
AND | OR
...
)
)
AND
(
(
!(ActionMatches{'<action>'} AND SubOperationMatches{'<subOperation>'})
AND
!(ActionMatches{'<action>'} AND SubOperationMatches{'<subOperation>'})
AND
...
)
OR
(
<attribute> <operator> {<value, <value>, ...}
AND | OR
<attribute> <operator> {<value>, <value>, ...}
AND | OR
...
)
)
AND
...
Akcje
Obecnie warunki można dodać do wbudowanych lub niestandardowych przypisań ról, które mają akcje danych magazynu obiektów blob lub magazynu kolejek. Należą do nich następujące wbudowane role:
- Współautor danych obiektu blob usługi Storage
- Właściciel danych obiektu blob usługi Storage
- Czytelnik danych obiektu blob usługi Storage
- Współautor danych kolejki usługi Storage
- Procesor komunikatów kolejki usługi Storage
- Nadawca komunikatu o danych kolejki usługi Storage
- Czytelnik danych kolejki usługi Storage
Aby uzyskać listę akcji magazynu, których można użyć w warunkach, zobacz:
- Akcje i atrybuty warunków przypisywania ról platformy Azure dla usługi Azure Blob Storage
- Akcje i atrybuty warunków przypisywania ról platformy Azure dla usługi Azure Queue Storage.
Atrybuty
W zależności od wybranych akcji atrybut może znajdować się w różnych miejscach. Jeśli wybierzesz wiele akcji dla jednego warunku, może istnieć mniej atrybutów do wyboru dla warunku, ponieważ atrybuty muszą być dostępne we wszystkich wybranych akcjach. Aby określić atrybut, należy dołączyć źródło jako prefiks.
Źródło atrybutu | opis | Kod |
---|---|---|
Środowisko | Atrybut jest skojarzony ze środowiskiem żądania, takim jak źródło sieci żądania lub bieżąca data i godzina. |
@Environment |
Główny | Atrybut jest niestandardowym atrybutem zabezpieczeń przypisanym do podmiotu zabezpieczeń, takiego jak użytkownik lub aplikacja przedsiębiorstwa (jednostka usługi). | @Principal |
Zażądaj | Atrybut jest częścią żądania akcji, takiego jak ustawienie tagu indeksu obiektów blob. | @Request |
Zasób | Atrybut jest właściwością zasobu, taką jak nazwa kontenera. | @Resource |
Aby uzyskać pełną listę atrybutów magazynu, których można użyć w warunkach, zobacz:
Atrybuty środowiska
Atrybuty środowiska są skojarzone z okolicznościami, w których jest wykonywane żądanie dostępu, takie jak data i godzina dnia lub środowisko sieciowe. Środowisko sieciowe może dotyczyć tego, czy dostęp odbywa się za pośrednictwem określonego prywatnego punktu końcowego, czy podsieci sieci wirtualnej, czy też za pośrednictwem jakiegokolwiek łącza prywatnego.
W poniższej tabeli wymieniono obsługiwane atrybuty środowiska dla warunków.
Display name | Opis | Atrybut | Typ |
---|---|---|---|
Czy łączeprywatne 1 | Użyj tego atrybutu w warunkach, aby wymagać dostępu za pośrednictwem dowolnego łącza prywatnego. | isPrivateLink |
Wartość logiczna |
Prywatny punkt końcowy1,2 | Użyj tego atrybutu w warunkach, aby ograniczyć dostęp do określonego prywatnego punktu końcowego. | Microsoft.Network/privateEndpoints |
ciąg |
Podsieć1,3 | Użyj tego atrybutu w warunkach, aby ograniczyć dostęp z określonej podsieci. | Microsoft.Network/virtualNetworks/subnets |
ciąg |
Czas UTC teraz | Użyj tego atrybutu w warunkach, aby ograniczyć dostęp do obiektów w określonych okresach. | UtcNow |
Data/godzina |
1 W przypadku operacji Is private link
kopiowania atrybuty , Private endpoint
i Subnet
mają zastosowanie tylko do miejsca docelowego, takiego konta magazynu, a nie do źródła. Aby uzyskać więcej informacji na temat operacji kopiowania, do których ma to zastosowanie, wybierz każdy atrybut w tabeli, aby wyświetlić więcej szczegółów.
2 Możesz użyć atrybutu Private endpoint
tylko wtedy, gdy w subskrypcji jest skonfigurowany co najmniej jeden prywatny punkt końcowy.
3 Możesz użyć atrybutu Subnet
tylko wtedy, gdy obecnie masz co najmniej jedną podsieć sieci wirtualnej przy użyciu punktów końcowych usługi skonfigurowanych w ramach subskrypcji.
Atrybuty podmiotu zabezpieczeń
Atrybuty podmiotu zabezpieczeń są atrybutami zabezpieczeń niestandardowymi przypisanymi do podmiotu zabezpieczeń żądającego dostępu do zasobu. Podmiot zabezpieczeń może być użytkownikiem lub aplikacją przedsiębiorstwa (jednostką usługi).
Aby użyć atrybutów głównych, musisz mieć następujące elementy:
- Uprawnienia firmy Microsoft Entra dla zalogowanego użytkownika, takie jak rola Administrator przypisania atrybutów
- Niestandardowe atrybuty zabezpieczeń zdefiniowane w identyfikatorze Entra firmy Microsoft
Aby uzyskać więcej informacji na temat niestandardowych atrybutów zabezpieczeń, zobacz:
- Dodawanie lub dezaktywowanie niestandardowych atrybutów zabezpieczeń w identyfikatorze Entra firmy Microsoft
- Zezwalaj na dostęp do odczytu do obiektów blob na podstawie tagów i niestandardowych atrybutów zabezpieczeń
- Podmiot zabezpieczeń nie jest wyświetlany w źródle atrybutu
Atrybuty żądania
Atrybuty żądania są skojarzone z kryteriami określonymi w żądaniu dostępu, takimi jak określony prefiks obiektów blob do wyświetlania.
Atrybuty zasobów
Atrybuty zasobów są skojarzone z obiektem, do którego jest żądany dostęp, na przykład nazwa konta magazynu, nazwa kontenera lub czy hierarchiczna przestrzeń nazw jest włączona dla konta magazynu.
Operatory funkcji
W tej sekcji wymieniono operatory funkcji, które są dostępne do konstruowania warunków.
ActionMatches
Właściwości | Wartość |
---|---|
Operator | ActionMatches |
Opis | Sprawdza, czy bieżąca akcja jest zgodna ze wzorcem określonej akcji. |
Przykłady | ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} Jeśli sprawdzana akcja jest równa "Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read", to prawda ActionMatches{'Microsoft.Authorization/roleAssignments/*'} Jeśli sprawdzana akcja jest równa "Microsoft.Authorization/roleAssignments/write", to prawda ActionMatches{'Microsoft.Authorization/roleDefinitions/*'} Jeśli sprawdzana akcja jest równa "Microsoft.Authorization/roleAssignments/write", to false |
PodOperationMatches
Właściwości | Wartość |
---|---|
Operator | SubOperationMatches |
Opis | Sprawdza, czy bieżąca podoperacja jest zgodna z określonym wzorcem podoperacji. |
Przykłady | SubOperationMatches{'Blob.List'} |
Exists
Właściwości | Wartość |
---|---|
Operator | Exists |
Opis | Sprawdza, czy określony atrybut istnieje. |
Przykłady | Exists @Request[Microsoft.Storage/storageAccounts/blobServices/containers/blobs:snapshot] |
Obsługa atrybutów 1 | Nazwa zakresu szyfrowania Migawka Identyfikator wersji |
1 Operator Exists
jest obsługiwany tylko dla tych atrybutów w konstruktorze warunków ABAC wizualizacji w witrynie Azure Portal. Operator można dodać do dowolnego atrybutu Exists
przy użyciu innych narzędzi, takich jak program PowerShell, interfejs wiersza polecenia platformy Azure, interfejs API REST i edytor kodu warunku w witrynie Azure Portal.
Operatory logiczne
W tej sekcji wymieniono operatory logiczne, które są dostępne do konstruowania warunków.
And
Właściwości | Wartość |
---|---|
Operatory | AND && |
Opis | Operator and. |
Przykłady | !(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND NOT SubOperationMatches{'Blob.List'}) |
Or
Właściwości | Wartość |
---|---|
Operatory | OR || |
Opis | Lub operator. |
Przykłady | @Request[Microsoft.Storage/storageAccounts/blobServices/containers/blobs:versionId] DateTimeEquals '2022-06-01T00:00:00.0Z' OR NOT Exists @Request[Microsoft.Storage/storageAccounts/blobServices/containers/blobs:versionId |
Not
Właściwości | Wartość |
---|---|
Operatory | NOT ! |
Opis | Operator nie lub negacji. |
Przykłady | NOT Exists @Request[Microsoft.Storage/storageAccounts/blobServices/containers/blobs:versionId] |
Operatory porównania warunkowego
W tej sekcji wymieniono operatory porównania warunkowego, które są dostępne do konstruowania warunków.
Właściwości | Wartość |
---|---|
Operatory | BoolEquals BoolNotEquals |
Opis | Porównanie wartości logicznych. |
Przykłady | @Resource[Microsoft.Storage/storageAccounts:isHnsEnabled] BoolEquals true |
Operatory porównania ciągów
W tej sekcji wymieniono operatory porównania ciągów, które są dostępne do konstruowania warunków.
StringEquals
Właściwości | Wartość |
---|---|
Operatory | StringEquals StringEqualsIgnoreCase |
Opis | Dopasowanie uwzględniające wielkość liter (lub bez uwzględniania wielkości liter). Wartości muszą być dokładnie zgodne z ciągiem. |
Przykłady | @Request[Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags:Project<$key_case_sensitive$>] StringEquals 'Cascade' |
StringNotEquals
Właściwości | Wartość |
---|---|
Operatory | StringNotEquals StringNotEqualsIgnoreCase |
Opis | Negacja StringEquals operatora (lub StringEqualsIgnoreCase ). |
StringStartsWith
Właściwości | Wartość |
---|---|
Operatory | StringStartsWith StringStartsWithIgnoreCase |
Opis | Dopasowanie uwzględniające wielkość liter (lub bez uwzględniania wielkości liter). Wartości zaczynają się od ciągu. |
StringNotStartsWith
Właściwości | Wartość |
---|---|
Operatory | StringNotStartsWith StringNotStartsWithIgnoreCase |
Opis | Negacja StringStartsWith operatora (lub StringStartsWithIgnoreCase ). |
StringLike
Właściwości | Wartość |
---|---|
Operatory | StringLike StringLikeIgnoreCase |
Opis | Dopasowanie uwzględniające wielkość liter (lub bez uwzględniania wielkości liter). Wartości mogą zawierać wieloznaczne symbole wieloznaczne (* ) lub symbol wieloznaczny zgodny z symbolami wieloznacznymi (? ) w dowolnym miejscu w ciągu. W razie potrzeby te znaki można wywrócić, dodając ukośnik \* odwrotny i \? . |
Przykłady | @Resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs:path] StringLike 'readonly/*' Resource[name1] StringLike 'a*c?' Jeśli wartość resource[name1] jest równa "abcd", wartość true Resource[name1] StringLike 'A*C?' Jeśli wartość zasobu[name1] jest równa "abcd", to wartość false Resource[name1] StringLike 'a*c' Jeśli wartość zasobu[name1] jest równa "abcd", to wartość false |
StringNotLike
Właściwości | Wartość |
---|---|
Operatory | StringNotLike StringNotLikeIgnoreCase |
Opis | Negacja StringLike operatora (lub StringLikeIgnoreCase ). |
Operatory porównania liczbowego
W tej sekcji wymieniono operatory porównania liczbowego, które są dostępne do konstruowania warunków.
Właściwości | Wartość |
---|---|
Operatory | NumericEquals NumericNotEquals NumericGreaterThan NumericGreaterThanEquals NumericLessThan NumericLessThanEquals |
Opis | Dopasowywanie liczb. Obsługiwane są tylko liczby całkowite. |
Operatory porównania DateTime
W tej sekcji wymieniono operatory porównania daty/godziny, które są dostępne do konstruowania warunków.
Właściwości | Wartość |
---|---|
Operatory | DateTimeEquals DateTimeNotEquals DateTimeGreaterThan DateTimeGreaterThanEquals DateTimeLessThan DateTimeLessThanEquals |
Opis | Pełna precyzja sprawdzania przy użyciu formatu: yyyy-mm-ddThh:mm:ss.mmmmmmmZ . Używany w przypadku identyfikatora wersji obiektu blob, migawki obiektu blob i czasu UTC. |
Przykłady | @Request[Microsoft.Storage/storageAccounts/blobServices/containers/blobs:versionId] DateTimeEquals '2022-06-01T00:00:00.0Z' |
Operatory porównania identyfikatora GUID
W tej sekcji wymieniono operatory porównania globalnie unikatowego identyfikatora (GUID), które są dostępne do konstruowania warunków.
Właściwości | Wartość |
---|---|
Operatory | GuidEquals GuidNotEquals |
Opis | Dopasowanie bez uwzględniania wielkości liter z formatem: 00000000-0000-0000-0000-000000000000 . Służy do identyfikowania zasobu, takiego jak identyfikator podmiotu zabezpieczeń lub identyfikator definicji roli. |
Przykłady |
Operatory porównania między produktami
W tej sekcji wymieniono operatory porównania między produktami, które są dostępne do konstruowania warunków.
ForAnyOfAnyValues
Właściwości | Wartość |
---|---|
Operatory | ForAnyOfAnyValues:StringEquals ForAnyOfAnyValues:StringEqualsIgnoreCase ForAnyOfAnyValues:StringNotEquals ForAnyOfAnyValues:StringNotEqualsIgnoreCase ForAnyOfAnyValues:StringLike ForAnyOfAnyValues:StringLikeIgnoreCase ForAnyOfAnyValues:StringNotLike ForAnyOfAnyValues:StringNotLikeIgnoreCase ForAnyOfAnyValues:NumericEquals ForAnyOfAnyValues:NumericNotEquals ForAnyOfAnyValues:NumericGreaterThan ForAnyOfAnyValues:NumericGreaterThanEquals ForAnyOfAnyValues:NumericLessThan ForAnyOfAnyValues:NumericLessThanEquals ForAnyOfAnyValues:GuidEquals ForAnyOfAnyValues:GuidNotEquals |
Opis | Jeśli co najmniej jedna wartość po lewej stronie spełnia porównanie z co najmniej jedną wartością po prawej stronie, wyrażenie daje wartość true. Ma format: ForAnyOfAnyValues:<BooleanFunction> . Obsługuje wiele ciągów i liczb. |
Przykłady | @Resource[Microsoft.Storage/storageAccounts/encryptionScopes:name] ForAnyOfAnyValues:StringEquals {'validScope1', 'validScope2'} Jeśli nazwa zakresu szyfrowania jest validScope1 równa lub validScope2 , wartość true.{'red', 'blue'} ForAnyOfAnyValues:StringEquals {'blue', 'green'} prawda {'red', 'blue'} ForAnyOfAnyValues:StringEquals {'orange', 'green'} fałsz |
ForAllOfAnyValues
Właściwości | Wartość |
---|---|
Operatory | ForAllOfAnyValues:StringEquals ForAllOfAnyValues:StringEqualsIgnoreCase ForAllOfAnyValues:StringNotEquals ForAllOfAnyValues:StringNotEqualsIgnoreCase ForAllOfAnyValues:StringLike ForAllOfAnyValues:StringLikeIgnoreCase ForAllOfAnyValues:StringNotLike ForAllOfAnyValues:StringNotLikeIgnoreCase ForAllOfAnyValues:NumericEquals ForAllOfAnyValues:NumericNotEquals ForAllOfAnyValues:NumericGreaterThan ForAllOfAnyValues:NumericGreaterThanEquals ForAllOfAnyValues:NumericLessThan ForAllOfAnyValues:NumericLessThanEquals ForAllOfAnyValues:GuidEquals ForAllOfAnyValues:GuidNotEquals |
Opis | Jeśli każda wartość po lewej stronie spełnia porównanie z co najmniej jedną wartością po prawej stronie, wyrażenie daje wartość true. Ma format: ForAllOfAnyValues:<BooleanFunction> . Obsługuje wiele ciągów i liczb. |
Przykłady | @Request[Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags:Project<$key_case_sensitive$>] ForAllOfAnyValues:StringEquals {'Cascade', 'Baker', 'Skagit'} {'red', 'blue'} ForAllOfAnyValues:StringEquals {'orange', 'red', 'blue'} prawda {'red', 'blue'} ForAllOfAnyValues:StringEquals {'red', 'green'} fałsz |
ForAnyOfAllValues
Właściwości | Wartość |
---|---|
Operatory | ForAnyOfAllValues:StringEquals ForAnyOfAllValues:StringEqualsIgnoreCase ForAnyOfAllValues:StringNotEquals ForAnyOfAllValues:StringNotEqualsIgnoreCase ForAnyOfAllValues:StringLike ForAnyOfAllValues:StringLikeIgnoreCase ForAnyOfAllValues:StringNotLike ForAnyOfAllValues:StringNotLikeIgnoreCase ForAnyOfAllValues:NumericEquals ForAnyOfAllValues:NumericNotEquals ForAnyOfAllValues:NumericGreaterThan ForAnyOfAllValues:NumericGreaterThanEquals ForAnyOfAllValues:NumericLessThan ForAnyOfAllValues:NumericLessThanEquals ForAnyOfAllValues:GuidEquals ForAnyOfAllValues:GuidNotEquals |
Opis | Jeśli co najmniej jedna wartość po lewej stronie spełnia porównanie z każdą wartością po prawej stronie, wyrażenie daje wartość true. Ma format: ForAnyOfAllValues:<BooleanFunction> . Obsługuje wiele ciągów i liczb. |
Przykłady | {10, 20} ForAnyOfAllValues:NumericLessThan {15, 18} prawda |
ForAllOfAllValues
Właściwości | Wartość |
---|---|
Operatory | ForAllOfAllValues:StringEquals ForAllOfAllValues:StringEqualsIgnoreCase ForAllOfAllValues:StringNotEquals ForAllOfAllValues:StringNotEqualsIgnoreCase ForAllOfAllValues:StringLike ForAllOfAllValues:StringLikeIgnoreCase ForAllOfAllValues:StringNotLike ForAllOfAllValues:StringNotLikeIgnoreCase ForAllOfAllValues:NumericEquals ForAllOfAllValues:NumericNotEquals ForAllOfAllValues:NumericGreaterThan ForAllOfAllValues:NumericGreaterThanEquals ForAllOfAllValues:NumericLessThan ForAllOfAllValues:NumericLessThanEquals ForAllOfAllValues:GuidEquals ForAllOfAllValues:GuidNotEquals |
Opis | Jeśli każda wartość po lewej stronie spełnia porównanie z każdą wartością po prawej stronie, wyrażenie zwróci wartość true. Ma format: ForAllOfAllValues:<BooleanFunction> . Obsługuje wiele ciągów i liczb. |
Przykłady | {10, 20} ForAllOfAllValues:NumericLessThan {5, 15, 18} fałsz {10, 20} ForAllOfAllValues:NumericLessThan {25, 30} prawda {10, 20} ForAllOfAllValues:NumericLessThan {15, 25, 30} fałsz |
Znaki specjalne
Znak | opis |
---|---|
* |
Gwiazdka (*) reprezentuje wieloznaczne dopasowanie symboli wieloznacznych, których można używać z operatorami Like . W razie potrzeby możesz uniknąć gwiazdki, dodając ukośnik \* odwrotny . |
? |
Znak zapytania (?) reprezentuje jednoznaczne dopasowanie symboli wieloznacznych, których można używać z operatorami Like . W razie potrzeby możesz uniknąć znaku zapytania, dodając ukośnik \? odwrotny. |
$ |
Znak dolara ($) służy do oznaczania kluczy tagów. W programie Azure PowerShell, jeśli ciąg ujęty w cudzysłów (") zawiera znak dolara, musisz poprzedzić go znakiem backtick ('). Na przykład: tags:Project<`$key_case_sensitive`$> . |
Grupowanie i pierwszeństwo
Jeśli masz co najmniej trzy wyrażenia dla akcji docelowej z różnymi operatorami między wyrażeniami, kolejność obliczania jest niejednoznaczna. Nawiasy ()
służą do grupowania wyrażeń i określania kolejności oceniania wyrażeń. Wyrażenia ujęte w nawiasy mają wyższy priorytet. Jeśli na przykład masz następujące wyrażenie:
a AND b OR c
Nawiasy należy dodać w jeden z następujących sposobów:
(a AND b) OR c
a AND (b OR c)