Adatbázis mechanizmus

Hogyan működik
SQL
INSERT/UPDATE/DELETE
SELECT
QUOTE
XML
INSERT
CREATE TABLE
DROP TABLE
ALTER TABLE
Kód az XML feldolgozásához
Adatbázis-meghajtók
Támogatott adatbázisok

Az OTRS olyan adatbázis réteggel érkezik, amely különböző adatbázisokat támogat.

Hogyan működik

Az adatbázis rétegnek (Kernel::System::DB) két bemeneti lehetősége van: SQL és XML.

SQL

Az SQL felületet kell használni a normál adatbázis-műveleteknél (SELECT, INSERT, UPDATE, …). Úgy használható mint egy normál Perl DBI felület.

INSERT/UPDATE/DELETE
$Kernel::OM->Get('Kernel::System::DB')->Do(
    SQL=> "INSERT INTO table (name, id) VALUES ('Valamilyen név', 123)",
);

$Kernel::OM->Get('Kernel::System::DB')->Do(
    SQL=> "UPDATE table SET name = 'Valamilyen név', id = 123",
);

$Kernel::OM->Get('Kernel::System::DB')->Do(
    SQL=> "DELETE FROM table WHERE id = 123",
);
            
SELECT
my $SQL = "SELECT id FROM table WHERE tn = '123'";

$Kernel::OM->Get('Kernel::System::DB')->Prepare(SQL => $SQL, Limit => 15);

while (my @Row = $Kernel::OM->Get('Kernel::System::DB')->FetchrowArray()) {
    $Id = $Row[0];
}
return $Id;
            

Megjegyzés

Vigyázzon arra, hogy a Limit megadását paraméterként használja, és ne az SQL utasításban, mert nem minden adatbázis támogatja a LIMIT kulcsszót az SQL lekérdezésekben.

my $SQL = "SELECT id FROM table WHERE tn = ? AND group = ?";

$Kernel::OM->Get('Kernel::System::DB')->Prepare(
    SQL   => $SQL,
    Limit => 15,
    Bind  => [ $Tn, $Group ],
);

while (my @Row = $Kernel::OM->Get('Kernel::System::DB')->FetchrowArray()) {
    $Id = $Row[0];
}
return $Id;
            

Megjegyzés

Használja a Bind attribútumot, ahol csak tudja, különösen a hosszú utasításoknál. Ha a Bind attribútumot használja, akkor nincs szükség a Quote() függvényre.

QUOTE

Szöveg:

my $QuotedString = $Kernel::OM->Get('Kernel::System::DB')->Quote("Ez egy probléma!");
                    

Egész:

my $QuotedInteger = $Kernel::OM->Get('Kernel::System::DB')->Quote('123', 'Integer');
                    

Szám:

my $QuotedNumber = $Kernel::OM->Get('Kernel::System::DB')->Quote('21.35', 'Number');
                    

Megjegyzés

A Bind attribútumot használja a Quote() függvény helyett, ahol csak tudja.

XML

Az XML felületet kell használni INSERT, CREATE TABLE, DROP TABLE és ALTER TABLE utasításoknál. Mivel ez a szintaxis adatbázisról adatbázisra eltérő, ezért ennek használata gondoskodik arról, hogy olyan alkalmazásokat írjon, amelyek az összesnél használhatók.

Megjegyzés

Az <Insert> szintaxis megváltozott a 2.2 és újabb verziókban. Az értékeket mostantól a címketartalomban használják (többé nem egy attribútumban).

INSERT
<Insert Table="some_table">
    <Data Key="id">1</Data>
    <Data Key="description" Type="Quote">exploit</Data>
</Insert>
            
CREATE TABLE

A lehetséges adattípusok a következők: BIGINT, SMALLINT, INTEGER, VARCHAR (Size=1-1000000), DATE (Formátum: yyyy-mm-dd hh:mm:ss) és LONGBLOB.

<TableCreate Name="calendar_event">
    <Column Name="id" Required="true" PrimaryKey="true" AutoIncrement="true" Type="BIGINT"/>
    <Column Name="title" Required="true" Size="250" Type="VARCHAR"/>
    <Column Name="content" Required="false" Size="250" Type="VARCHAR"/>
    <Column Name="start_time" Required="true" Type="DATE"/>
    <Column Name="end_time" Required="true" Type="DATE"/>
    <Column Name="owner_id" Required="true" Type="INTEGER"/>
    <Column Name="event_status" Required="true" Size="50" Type="VARCHAR"/>
    <Index Name="calendar_event_title">
        <IndexColumn Name="title"/>
    </Index>
    <Unique Name="calendar_event_title">
        <UniqueColumn Name="title"/>
    </Unique>
    <ForeignKey ForeignTable="users">
        <Reference Local="owner_id" Foreign="id"/>
    </ForeignKey>
</TableCreate>
            

A LONGBLOB oszlopok különleges bánásmódot igényelnek. A tartalmukat Base64-re kell átkódolni, ha az adatbázis-meghajtó nem támogatja a DirectBlob funkciót. Nézze meg a következő példát:

my $Content = $StorableContent;
if ( !$DBObject->GetDatabaseFunction('DirectBlob') ) {
    $Content = MIME::Base64::encode_base64($StorableContent);
}
            

Hasonlóan, amikor egy ilyen oszlopból olvas, akkor a tartalmat tilos automatikusan UTF-8-ként visszaalakítani az Encode => 0 jelző átadásával a Prepare() függvénynek:

return if !$DBObject->Prepare(
    SQL => '
        SELECT content_type, content, content_id, content_alternative, disposition, filename
        FROM article_data_mime_attachment
        WHERE id = ?',
    Bind   => [ \$AttachmentID ],
    Encode => [ 1, 0, 0, 0, 1, 1 ],
);

while ( my @Row = $DBObject->FetchrowArray() ) {

    $Data{ContentType} = $Row[0];

    # Melléklet visszaalakítása, ha például postgresql háttérprogramot használ.
    if ( !$DBObject->GetDatabaseFunction('DirectBlob') ) {
        $Data{Content} = decode_base64( $Row[1] );
    }
    else {
        $Data{Content} = $Row[1];
    }
    $Data{ContentID}          = $Row[2] || '';
    $Data{ContentAlternative} = $Row[3] || '';
    $Data{Disposition}        = $Row[4];
    $Data{Filename}           = $Row[5];
}
            
DROP TABLE
<TableDrop Name="calendar_event"/>
            
ALTER TABLE

A következő az oszlopok hozzáadásának, megváltoztatásának és eldobásának példáját jeleníti meg.

<TableAlter Name="calendar_event">
    <ColumnAdd Name="test_name" Type="varchar" Size="20" Required="true"/>

    <ColumnChange NameOld="test_name" NameNew="test_title" Type="varchar" Size="30" Required="true"/>

    <ColumnChange NameOld="test_title" NameNew="test_title" Type="varchar" Size="100" Required="false"/>

    <ColumnDrop Name="test_title"/>

    <IndexCreate Name="index_test3">
        <IndexColumn Name="test3"/>
    </IndexCreate>

    <IndexDrop Name="index_test3"/>

    <UniqueCreate Name="uniq_test3">
        <UniqueColumn Name="test3"/>
    </UniqueCreate>

    <UniqueDrop Name="uniq_test3"/>
</TableAlter>
            

A következő egy olyan példát jelenít meg, hogy hogyan nevezhető át egy tábla.

<TableAlter NameOld="calendar_event" NameNew="calendar_event_new"/>
            
Kód az XML feldolgozásához
my @XMLARRAY = @{$Self->ParseXML(String => $XML)};

my @SQL = $Kernel::OM->Get('Kernel::System::DB')->SQLProcessor(
    Database => \@XMLARRAY,
);
push(@SQL, $Kernel::OM->Get('Kernel::System::DB')->SQLProcessorPost());

for (@SQL) {
    $Kernel::OM->Get('Kernel::System::DB')->Do(SQL => $_);
}
            

Adatbázis-meghajtók

Az adatbázis-meghajtók az $OTRS_HOME/Kernel/System/DB/*.pm alatt találhatók.

Támogatott adatbázisok

  • MySQL

  • PostgreSQL

  • Oracle

  • Microsoft SQL Server (csak külső adatbázis-kapcsolatokhoz, nem OTRS adatbázisként)