Megosztás a következőn keresztül:


Azure Blob Storage kimeneti kötés az Azure Functionshez

A kimeneti kötés lehetővé teszi a Blob Storage-adatok módosítását és törlését egy Azure-függvényben.

A beállítással és a konfigurációval kapcsolatos információkért tekintse meg az áttekintést.

Fontos

Ez a cikk lapokat használ a Node.js programozási modell több verziójának támogatásához. A v4-modell általánosan elérhető, és úgy lett kialakítva, hogy rugalmasabb és intuitívabb felhasználói élményt nyújtson JavaScript- és TypeScript-fejlesztők számára. A v4-modell működésével kapcsolatos további információkért tekintse meg az Azure Functions Node.js fejlesztői útmutatóját. A v3 és a v4 közötti különbségekről a migrálási útmutatóban olvashat bővebben.

Az Azure Functions két Python-programozási modellt támogat. A kötések definiálásának módja a választott programozási modelltől függ.

A Python v2 programozási modell lehetővé teszi, hogy a kötéseket dekorátorokkal definiálja közvetlenül a Python-függvénykódban. További információt a Python fejlesztői útmutatójában talál.

Ez a cikk mindkét programozási modellt támogatja.

Példa

A C#-függvények a következő C#-módok egyikével hozhatók létre:

  • Izolált feldolgozómodell: Lefordított C# függvény, amely a futtatókörnyezettől elkülönített feldolgozói folyamatban fut. Izolált feldolgozói folyamat szükséges az LTS- és nem LTS-verziókon futó C#-függvények támogatásához .NET és .NET-keretrendszer. Az izolált feldolgozói folyamatfüggvények bővítményei névtereket használnak Microsoft.Azure.Functions.Worker.Extensions.* .
  • Folyamaton belüli modell: Lefordított C# függvény, amely ugyanabban a folyamatban fut, mint a Functions-futtatókörnyezet. A modell egy változatában a Functions C#-szkriptekkel futtatható, amely elsősorban a C#-portál szerkesztéséhez támogatott. A folyamaton belüli függvények bővítményei névtereket használnak Microsoft.Azure.WebJobs.Extensions.* .

Az alábbi példa egy C# függvény , amely egy izolált feldolgozófolyamatban fut, és blob-eseményindítót használ blobbemenettel és blobkimeneti blobkötésekkel. A függvényt egy blob létrehozása váltja ki a test-samples-trigger tárolóban. Beolvassa a szövegfájlt a test-samples-input tárolóból, és létrehoz egy új szövegfájlt egy kimeneti tárolóban az aktivált fájl neve alapján.

using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.Logging;

namespace SampleApp
{
    public static class BlobFunction
    {
        [Function(nameof(BlobFunction))]
        [BlobOutput("test-samples-output/{name}-output.txt")]
        public static string Run(
            [BlobTrigger("test-samples-trigger/{name}")] string myTriggerItem,
            [BlobInput("test-samples-input/sample1.txt")] string myBlob,
            FunctionContext context)
        {
            var logger = context.GetLogger("BlobFunction");
            logger.LogInformation("Triggered Item = {myTriggerItem}", myTriggerItem);
            logger.LogInformation("Input Item = {myBlob}", myBlob);

            // Blob Output
            return "blob-output content";
        }
    }
}

Ez a szakasz a következő példákat tartalmazza:

HTTP-eseményindító, OutputBinding (Java) használatával

Az alábbi példa egy Java-függvényt mutat be, amely a HttpTrigger széljegyzet használatával egy blobtárolóban lévő fájl nevét tartalmazó paramétert fogad. A BlobInput széljegyzet ezután felolvassa a fájlt, és továbbítja annak tartalmát a függvénynek byte[]. A BlobOutput széljegyzet a OutputBinding outputItemfüggvény által a bemeneti blob tartalmának a konfigurált tárolóba való írására szolgál.

  @FunctionName("copyBlobHttp")
  @StorageAccount("Storage_Account_Connection_String")
  public HttpResponseMessage copyBlobHttp(
    @HttpTrigger(name = "req", 
      methods = {HttpMethod.GET}, 
      authLevel = AuthorizationLevel.ANONYMOUS) 
    HttpRequestMessage<Optional<String>> request,
    @BlobInput(
      name = "file", 
      dataType = "binary", 
      path = "samples-workitems/{Query.file}") 
    byte[] content,
    @BlobOutput(
      name = "target", 
      path = "myblob/{Query.file}-CopyViaHttp")
    OutputBinding<String> outputItem,
    final ExecutionContext context) {
      // Save blob to outputItem
      outputItem.setValue(new String(content, StandardCharsets.UTF_8));

      // build HTTP response with size of requested blob
      return request.createResponseBuilder(HttpStatus.OK)
        .body("The size of \"" + request.getQueryParameters().get("file") + "\" is: " + content.length + " bytes")
        .build();
  }

Üzenetsor-eseményindító függvény visszatérési értékének használatával (Java)

Az alábbi példa egy Java-függvényt mutat be, amely a QueueTrigger széljegyzetet használja egy blobtárolóban lévő fájl nevét tartalmazó üzenet fogadásához. A BlobInput széljegyzet ezután felolvassa a fájlt, és továbbítja annak tartalmát a függvénynek byte[]. A BlobOutput jegyzet a függvény visszatérési értékéhez kötődik, amelyet a futtatókörnyezet a bemeneti blob tartalmának a konfigurált tárolóba való írásához használ.

  @FunctionName("copyBlobQueueTrigger")
  @StorageAccount("Storage_Account_Connection_String")
  @BlobOutput(
    name = "target", 
    path = "myblob/{queueTrigger}-Copy")
  public String copyBlobQueue(
    @QueueTrigger(
      name = "filename", 
      dataType = "string",
      queueName = "myqueue-items") 
    String filename,
    @BlobInput(
      name = "file", 
      path = "samples-workitems/{queueTrigger}") 
    String content,
    final ExecutionContext context) {
      context.getLogger().info("The content of \"" + filename + "\" is: " + content);
      return content;
  }

A Java-függvények futtatókörnyezeti kódtárában használja a jegyzetet olyan @BlobOutput függvényparamétereken, amelyek értékét egy blobtárolóban lévő objektumba írná. A paramétertípusnak a következőnek kell lennie OutputBinding<T>: hol T található natív Java-típus vagy POJO.

Az alábbi példa egy üzenetsor által aktivált TypeScript-függvényt mutat be, amely egy blob másolatát készíti. A függvényt egy üzenetsor-üzenet aktiválja, amely tartalmazza a másolandó blob nevét. Az új blob neve {originalblobname}-Copy.

import { app, input, InvocationContext, output } from '@azure/functions';

const blobInput = input.storageBlob({
    path: 'samples-workitems/{queueTrigger}',
    connection: 'MyStorageConnectionAppSetting',
});

const blobOutput = output.storageBlob({
    path: 'samples-workitems/{queueTrigger}-Copy',
    connection: 'MyStorageConnectionAppSetting',
});

export async function storageQueueTrigger1(queueItem: unknown, context: InvocationContext): Promise<unknown> {
    return context.extraInputs.get(blobInput);
}

app.storageQueue('storageQueueTrigger1', {
    queueName: 'myqueue-items',
    connection: 'MyStorageConnectionAppSetting',
    extraInputs: [blobInput],
    return: blobOutput,
    handler: storageQueueTrigger1,
});

Az alábbi példa egy üzenetsor által aktivált JavaScript-függvényt mutat be, amely egy blob másolatát készíti. A függvényt egy üzenetsor-üzenet aktiválja, amely tartalmazza a másolandó blob nevét. Az új blob neve {originalblobname}-Copy.

const { app, input, output } = require('@azure/functions');

const blobInput = input.storageBlob({
    path: 'samples-workitems/{queueTrigger}',
    connection: 'MyStorageConnectionAppSetting',
});

const blobOutput = output.storageBlob({
    path: 'samples-workitems/{queueTrigger}-Copy',
    connection: 'MyStorageConnectionAppSetting',
});

app.storageQueue('storageQueueTrigger1', {
    queueName: 'myqueue-items',
    connection: 'MyStorageConnectionAppSetting',
    extraInputs: [blobInput],
    return: blobOutput,
    handler: (queueItem, context) => {
        return context.extraInputs.get(blobInput);
    },
});

Az alábbi példa bemutatja, hogyan hozható létre egy bejövő blob másolata a PowerShell-függvény kimeneteként.

A függvény konfigurációs fájljában (function.json) a trigger metaadat-tulajdonság adja meg a kimeneti blob nevét a path tulajdonságokban.

Feljegyzés

A végtelen hurkok elkerülése érdekében győződjön meg arról, hogy a bemeneti és kimeneti útvonalak eltérőek.

{
  "bindings": [
    {
      "name": "myInputBlob",
      "path": "data/{trigger}",
      "connection": "MyStorageConnectionAppSetting",
      "direction": "in",
      "type": "blobTrigger"
    },
    {
      "name": "myOutputBlob",
      "type": "blob",
      "path": "data/copy/{trigger}",
      "connection": "MyStorageConnectionAppSetting",
      "direction": "out"
    }
  ],
  "disabled": false
}

A PowerShell-kód a következő:

# Input bindings are passed in via param block.
param([byte[]] $myInputBlob, $TriggerMetadata)
Write-Host "PowerShell Blob trigger function Processed blob Name: $($TriggerMetadata.Name)"
Push-OutputBinding -Name myOutputBlob -Value $myInputBlob

Az alábbi példa blobbemeneteket és kimeneti kötéseket mutat be. A példa attól függ, hogy a v1 vagy v2 Python programozási modellt használja-e.

A kód létrehoz egy blob másolatát.

import logging
import azure.functions as func

app = func.FunctionApp()

@app.function_name(name="BlobOutput1")
@app.route(route="file")
@app.blob_input(arg_name="inputblob",
                path="sample-workitems/test.txt",
                connection="<BLOB_CONNECTION_SETTING>")
@app.blob_output(arg_name="outputblob",
                path="newblob/test.txt",
                connection="<BLOB_CONNECTION_SETTING>")
def main(req: func.HttpRequest, inputblob: str, outputblob: func.Out[str]):
    logging.info(f'Python Queue trigger function processed {len(inputblob)} bytes')
    outputblob.set(inputblob)
    return "ok"

Attribútumok

A folyamaton belüli és az izolált feldolgozói folyamat C#-kódtárai attribútummal határozzák meg a függvényt. A C#-szkript ehelyett egy function.json konfigurációs fájlt használ a C#-szkriptelési útmutatóban leírtak szerint.

A BlobOutputAttribute konstruktor a következő paramétereket használja:

Paraméter Leírás
BlobPath A blob elérési útja.
Kapcsolat Egy alkalmazásbeállítás vagy beállításgyűjtemény neve, amely meghatározza, hogyan csatlakozhat az Azure Blobshoz. Lásd: Kapcsolatok.

Helyi fejlesztéskor adja hozzá az alkalmazásbeállításokat a gyűjtemény local.settings.json fájljáhozValues.

Dekorátorok

Csak a Python v2 programozási modellre vonatkozik.

A dekorátorokkal definiált Python v2-függvények esetében a következő tulajdonságok határozzák meg a blob_input blob_output Blob Storage-eseményindítókat:

Tulajdonság Leírás
arg_name Annak a változónak a neve, amely a függvénykódban a blobot jelöli.
path A dekoratőr blobjának blob_input elérési útja a blob olvasása. blob_output A dekorátor esetében ez a bemeneti blob kimenete vagy másolata.
connection A tárfiók kapcsolati sztringjét.
dataType A dinamikusan beírt nyelvek esetében a mögöttes adattípust adja meg. A lehetséges értékek a következők string: , binaryvagy stream. További részletekért tekintse meg az eseményindítók és kötések fogalmait.

A function.json használatával definiált Python-függvények esetében lásd a Konfiguráció szakaszt.

Jegyzetek

Az @BlobOutput attribútum hozzáférést biztosít a függvényt aktiváló blobhoz. Ha bájttömböt használ az attribútummal, állítsa a következőre dataType binary: . Részletekért tekintse meg a kimeneti példát .

Konfiguráció

Csak a Python v1 programozási modellre vonatkozik.

Az alábbi táblázat a metódusnak output.storageBlob() átadott objektumon options beállítható tulajdonságokat ismerteti.

Tulajdonság Leírás
ösvény A blobtároló elérési útja.
kapcsolat Egy alkalmazásbeállítás vagy beállításgyűjtemény neve, amely meghatározza, hogyan csatlakozhat az Azure Blobshoz. Lásd: Kapcsolatok.

Az alábbi táblázat a function.json fájlban beállított kötéskonfigurációs tulajdonságokat ismerteti.

Tulajdonság Leírás
type A beállításnak a blobkövetkezőnek kell lennie: .
direction Kimeneti kötéshez be kell állítani out . A használati szakaszban kivételeket jegyezünk fel.
név Annak a változónak a neve, amely a függvénykódban a blobot jelöli. $return A függvény visszatérési értékére való hivatkozásra van állítva.
ösvény A blobtároló elérési útja.
kapcsolat Egy alkalmazásbeállítás vagy beállításgyűjtemény neve, amely meghatározza, hogyan csatlakozhat az Azure Blobshoz. Lásd: Kapcsolatok.

A teljes példákért tekintse meg a Példa szakaszt .

Használat

A blobkimenet által támogatott kötéstípusok a bővítménycsomag verziójától és a függvényalkalmazásban használt C# modalitástól függnek.

Ha azt szeretné, hogy a függvény egyetlen blobba írjon, a blob kimeneti kötése a következő típusokhoz kapcsolódhat:

Típus Leírás
string A blob tartalma sztringként. Akkor használható, ha a blob tartalma egyszerű szöveg.
byte[] A blobtartalom bájtja.
JSON szerializálható típusok Egy JSON-blob tartalmát képviselő objektum. A Functions egy egyszerű régi CLR-objektum (POCO) típust próbál JSON-adatokká szerializálni.

Ha azt szeretné, hogy a függvény több blobba írjon, a blob kimeneti kötése a következő típusokhoz kapcsolódhat:

Típus Leírás
T[] hol T található az egyetlen blob kimeneti kötéstípusa? Több blob tartalmát tartalmazó tömb. Minden bejegyzés egy blob tartalmát jelöli.

Egyéb kimeneti forgatókönyvek esetén közvetlenül hozzon létre és használjon típusokat az Azure.Storage.Blobsból.

Kötés a stringblob méretéhez, vagy Byte[] csak akkor ajánlott, ha a blob mérete kicsi. Ez azért ajánlott, mert a blob teljes tartalma betöltődik a memóriába. A legtöbb blobhoz használjon vagy írjon be egy típust Stream BlobClient . További információ: Egyidejűség és memóriahasználat.

Ha hibaüzenet jelenik meg a Storage SDK-típusok egyikéhez való kötéskor, győződjön meg arról, hogy rendelkezik a megfelelő Storage SDK-verzióra mutató hivatkozással.

A StorageAccountAttribute használatával is megadhatja a használni kívánt tárfiókot. Ezt akkor teheti meg, ha más tárfiókot kell használnia, mint a tár más funkcióit. A konstruktor egy tárolási kapcsolati sztring tartalmazó alkalmazásbeállítás nevét veszi fel. Az attribútum a paraméter, a metódus vagy az osztály szintjén alkalmazható. Az alábbi példa az osztályszintet és a metódusszintet mutatja be:

[StorageAccount("ClassLevelStorageAppSetting")]
public static class AzureFunctions
{
    [FunctionName("BlobTrigger")]
    [StorageAccount("FunctionLevelStorageAppSetting")]
    public static void Run( //...
{
    ....
}

A használni kívánt tárfiók meghatározása a következő sorrendben történik:

  • Az BlobTrigger attribútum tulajdonsága Connection .
  • Az StorageAccount attribútummal azonos paraméterre BlobTrigger alkalmazott attribútum.
  • A StorageAccount függvényre alkalmazott attribútum.
  • Az StorageAccount osztályra alkalmazott attribútum.
  • A függvényalkalmazás alapértelmezett tárfiókja, amely az AzureWebJobsStorage alkalmazásbeállításban van definiálva.

Az @BlobOutput attribútum hozzáférést biztosít a függvényt aktiváló blobhoz. Ha bájttömböt használ az attribútummal, állítsa a következőre dataType binary: . Részletekért tekintse meg a kimeneti példát .

A blobadatok eléréséhez adja vissza az értéket közvetlenül vagy a használatával context.extraOutputs.set().

A blobadatok elérése egy olyan paraméteren keresztül, amely megfelel a kötés névparamétere által a function.json fájlban megadott névnek.

A függvényparamétereket a következő típusokként deklarálhatja a blobtárolóba való íráshoz:

  • Sztringek func.Out[str]
  • Streamek func.Out[func.InputStream]

Részletekért tekintse meg a kimeneti példát .

Kapcsolatok

A connection tulajdonság a környezetkonfigurációra mutató hivatkozás, amely meghatározza, hogy az alkalmazásnak hogyan kell csatlakoznia az Azure Blobshoz. A következőt határozhatja meg:

Ha a konfigurált érték egy adott beállítás pontos egyezése, a többi beállítás előtagja pedig egyezik, akkor a rendszer a pontos egyezést használja.

Kapcsolati sztring

A kapcsolati sztring beszerzéséhez kövesse a tárfiók hozzáférési kulcsainak kezelése című témakörben ismertetett lépéseket. A kapcsolati sztring általános célú tárfióknak kell lennie, nem Blob Storage-fióknak.

Ezt a kapcsolati sztring a kötéskonfiguráció tulajdonsága által connection megadott értéknek megfelelő névvel rendelkező alkalmazásbeállításban kell tárolni.

Ha az alkalmazásbeállítás neve az "AzureWebJobs" névvel kezdődik, itt csak a név fennmaradó részét adhatja meg. Ha például a "MyStorage" értékre van állítva connection , a Functions-futtatókörnyezet egy "AzureWebJobsMyStorage" nevű alkalmazásbeállítást keres. Ha üresen hagyjaconnection, a Functions-futtatókörnyezet az alapértelmezett Storage-kapcsolati sztring használja a névvel ellátott AzureWebJobsStoragealkalmazásbeállításban.

Identitásalapú kapcsolatok

Ha a bővítmény 5.x vagy újabb verzióját használja (a 3.x vagy újabb csomag non-.NET nyelvi veremekhez), ahelyett, hogy titkos kapcsolati sztring használ, az alkalmazás Microsoft Entra-identitást használhat. Identitás használatához olyan beállításokat kell megadnia egy közös előtag alatt, amely leképezi a tulajdonságot az connection eseményindító és a kötés konfigurációjában.

Ha az "AzureWebJobsStorage" beállítást választjaconnection, olvassa el a Csatlakozás a gazdagép tárolójához identitással című témakört. Az összes többi kapcsolat esetében a bővítményhez a következő tulajdonságok szükségesek:

Tulajdonság Környezeti változó sablonja Leírás Példaérték
Blob Service URI <CONNECTION_NAME_PREFIX>__serviceUri1 Annak a blobszolgáltatásnak az adatsíkja, amelyhez csatlakozik, a HTTPS-séma használatával. <https:// storage_account_name.blob.core.windows.net>

Az 1 <CONNECTION_NAME_PREFIX>__blobServiceUri aliasként használható. Ha a kapcsolatkonfigurációt egy blob-eseményindító fogja használni, blobServiceUri azt is mellékelnie queueServiceUrikell. Lásd alább.

Az serviceUri űrlap nem használható, ha az általános kapcsolatkonfigurációt blobokon, üzenetsorokon és/vagy táblákon kell használni. Az URI csak a blobszolgáltatást tudja kijelölni. Alternatív megoldásként külön URI-t is megadhat az egyes szolgáltatásokhoz, így egyetlen kapcsolat használható. Ha mindkét verzió meg van adva, a rendszer a többszolgáltatásos űrlapot használja. Több szolgáltatás kapcsolatának konfigurálásához a következő helyett <CONNECTION_NAME_PREFIX>__serviceUriállítsa be a következőt:

Tulajdonság Környezeti változó sablonja Leírás Példaérték
Blob Service URI <CONNECTION_NAME_PREFIX>__blobServiceUri Annak a blobszolgáltatásnak az adatsíkja, amelyhez csatlakozik, a HTTPS-séma használatával. <https:// storage_account_name.blob.core.windows.net>
Queue Service URI (a 2. blob triggerekhezszükséges) <CONNECTION_NAME_PREFIX>__queueServiceUri Egy üzenetsor-szolgáltatás adatsíkjának URI-ja a HTTPS-séma használatával. Ez az érték csak a blob-eseményindítókhoz szükséges. <https:// storage_account_name.queue.core.windows.net>

2 A blob-eseményindító több újrapróbálkozási művelet hibáit is kezeli, ha méregblobokat ír egy üzenetsorba. serviceUri Az űrlapon a rendszer a AzureWebJobsStorage kapcsolatot használja. A beállításkor blobServiceUriazonban egy üzenetsor-szolgáltatás URI-jának is meg kell adni.queueServiceUri Javasoljuk, hogy a szolgáltatást a blobszolgáltatással azonos tárfiókból használja. Arról is gondoskodnia kell, hogy az eseményindító képes legyen üzeneteket olvasni és írni a konfigurált üzenetsor-szolgáltatásban egy olyan szerepkör hozzárendelésével, mint a Storage Queue Data Contributor.

Más tulajdonságok is beállíthatók a kapcsolat testreszabásához. Tekintse meg az identitásalapú kapcsolatok gyakori tulajdonságait.

Az Azure Functions szolgáltatásban üzemeltetett identitásalapú kapcsolatok felügyelt identitást használnak. A rendszer alapértelmezés szerint a rendszer által hozzárendelt identitást használja, bár a felhasználó által hozzárendelt identitás megadható a credential tulajdonságokkal együtt clientID . Vegye figyelembe, hogy a felhasználó által hozzárendelt identitás erőforrás-azonosítóval való konfigurálása nem támogatott. Ha más környezetekben, például helyi fejlesztésben fut, a rendszer ehelyett a fejlesztői identitást használja, bár ez testre szabható. Lásd: Helyi fejlesztés identitásalapú kapcsolatokkal.

Engedély megadása az identitáshoz

Bármilyen identitást is használ, rendelkeznie kell a kívánt műveletek végrehajtásához szükséges engedélyekkel. A legtöbb Azure-szolgáltatás esetében ez azt jelenti, hogy egy szerepkört kell hozzárendelnie az Azure RBAC-ben beépített vagy egyéni szerepkörökkel, amelyek biztosítják ezeket az engedélyeket.

Fontos

A célszolgáltatás bizonyos engedélyeket közzétehet, amelyek nem minden környezethez szükségesek. Ahol lehetséges, tartsa be a minimális jogosultság elvét, és csak az identitáshoz szükséges jogosultságokat adja meg. Ha például az alkalmazásnak csak adatforrásból kell olvasnia, használjon olyan szerepkört, amely csak olvasási engedéllyel rendelkezik. Nem lenne helyénvaló olyan szerepkört hozzárendelni, amely lehetővé teszi az írást is a szolgáltatáshoz, mivel ez túlzott engedély lenne egy olvasási művelethez. Hasonlóképpen meg szeretné győződni arról, hogy a szerepkör-hozzárendelés csak az elolvasandó erőforrásokra terjed ki.

Létre kell hoznia egy szerepkör-hozzárendelést, amely futásidőben hozzáférést biztosít a blobtárolóhoz. A tulajdonoshoz hasonló felügyeleti szerepkörök nem elegendőek. Az alábbi táblázat olyan beépített szerepköröket mutat be, amelyek a Blob Storage-bővítmény normál működésben való használatakor ajánlottak. Előfordulhat, hogy az alkalmazás további engedélyeket igényel az Ön által írt kód alapján.

Kötés típusa Példa beépített szerepkörökre
Eseményindító Storage Blob Data Owner and Storage Queue Data Contributor1

További engedélyeket is meg kell adni az AzureWebJobsStorage-kapcsolatnak.2
Bemeneti kötés Storage-blobadatok olvasója
Kimeneti kötés Storage-blobadatok tulajdonosa

1 A blob-eseményindító több újrapróbálkozás során is kezeli a hibákat, ha méregblobokat ír a kapcsolat által megadott tárfiók egyik üzenetsorába.

2 Az AzureWebJobsStorage kapcsolat belsőleg használatos az eseményindítót engedélyező blobokhoz és üzenetsorokhoz. Ha identitásalapú kapcsolat használatára van konfigurálva, az alapértelmezett követelményen túl további engedélyekre van szüksége. A szükséges engedélyekre a Storage Blob Data Owner, a Storage Queue Data Közreműködő és a Tárfiók közreműködői szerepkörei vonatkoznak. További információ: Csatlakozás a gazdagép tárolójához identitással.

Kivételek és visszatérési kódok

Kötés Referencia
Blob Blob hibakódjai
Blob, tábla, üzenetsor Tárolási hibakódok
Blob, tábla, üzenetsor Hibaelhárítás

Következő lépések