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 (méret = 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>
            
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)