Prinzessin
I'm new here

MySQL 5 externe View an CMS anbinden; Primary Key für View festlegen; Datenbankschema; FS5

Hallo,
wir haben eine externe MySQL Datenbank an das CMS angebunden.

Das Datenbankschema - basierend auf der Struktur der externen Datenbank - wird im CMS angelegt; allerdings ohne Views.

Hier ein Test für den Zugriff auf die besagte DB mit einer Tabelle und zwei Views:

views_im_cms.gif

Wir benutzen MySQL DB 5 und den dazu passenden JDBC-Treiber.

odbc_driver_db5.gif

Voraussetzung dafür, dass Views im CMS erscheinen / zum Datenbankschema hinzugefügt werden können, ist, dass die Views einen Primary Key vom Typ NUMBER (also integer oder long) oder STRING (also varchar oder text) haben müssen.


Bei der folgenden View wäre der produkt_sys_pk eindeutig, was man aber wohl nicht wirklich in MySQL 5 definieren kann!?

produkte_view.gif

Ich habe bereits einen SQL-Dump und einen Projekt-Export an den FirstSpirit Helpdesk gesendet und bekam folgende Antwort:


"ich habe heute das DDL auf unserer MySQL-DB (ebenfalls V5.0) eingespielt und konnte das Problem reproduzieren - sprich: bei der Aktion "Schema aus Datenbank erzeugen" wurde das View nicht mitimportiert.

Nach einer kurzen Recherche fand ich aber heraus, dass es unter MySql wohl gar nicht möglich ist einen Primary Key für ein View zu definieren (http://drupal.org/node/610896 z.B. unter Oracle dagegen geht es aber  http://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_8004.htm)
Ohne Primary Key kann also kein View zum Schema hinzugefügt werden. So einen Primary Key braucht aber FS, um einen Datensatz eindeutig zu verlinken."

Meine Frage ist nun, gibt es einen anderen Workaround bzw. eine Möglichkeit wie man für eine View in MySQL 5 einen PK festlegen kann?


0 Kudos
6 Replies
Peter_Jodeleit
Crownpeak employee

Du kannst versuchen, die Informationen "per Hand" in das Schema zu integrieren. Über "Extern bearbeiten / XML-Schema" bekommt man die interne Beschreibung der Struktur. Wenn man sich an einer bestehenden Tabelle orientiert, sollte es möglich sein, das hinzubekommen. Statt des Tabellennames einfach den Datenbank-Namen des Views eintragen.

Peter
0 Kudos

Hallo, ich habe es zwar in die externe Bearbeitung des XML-Schemas geschafft, allerdings wurde hier nur ein XML-Eintrag für die Tabelle an sich gemacht. Einträge für die beiden Views fehlen komplett.

Vor dem Test hatte ich das komplette Schema nochmal aus dem CMS entfernt und erneut wieder aufgenommen. Trotzdem erscheint nur die Tabelle:

<?xml version="1.0" encoding="UTF-8"?>

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <xs:element dbName="test" name="test" temporal="0" version="4.0">

        <xs:complexType dbName="t_languages" name="TLanguages" readonly="1">

            <xs:sequence>

                <xs:element dbName="active" javaType="java.lang.String" length="1" name="Active" nullable="1" type="xs:string"/>

                <xs:element dbName="cms_sprach_kuerzel" javaType="java.lang.String" length="3" name="CmsSprachKuerzel" nullable="1" type="xs:string"/>

                <xs:element dbName="fk_adb_asset" javaType="java.lang.Integer" length="10" name="FkAdbAsset" type="xs:integer"/>

                <xs:element dbName="fk_adb_asset2" javaType="java.lang.Integer" length="10" name="FkAdbAsset2" type="xs:integer"/>

                <xs:element dbName="fk_language_parent" javaType="java.lang.Integer" length="10" name="FkLanguageParent" type="xs:integer"/>

                <xs:element dbName="flagge" javaType="java.lang.String" length="250" name="Flagge" nullable="1" type="xs:string"/>

                <xs:element dbName="icon" javaType="java.lang.String" length="250" name="Icon" nullable="1" type="xs:string"/>

                <xs:element dbName="kopfbild" javaType="java.lang.String" length="250" name="Kopfbild" nullable="1" type="xs:string"/>

                <xs:element dbName="kuerzel" javaType="java.lang.String" length="3" name="Kuerzel" nullable="1" type="xs:string"/>

                <xs:element dbName="land_kennzeichen" javaType="java.lang.String" length="5" name="LandKennzeichen" nullable="1" type="xs:string"/>

                <xs:element dbName="land_kurzbezeichnung" javaType="java.lang.String" length="12" name="LandKurzbezeichnung" nullable="1" type="xs:string"/>

                <xs:element dbName="name" javaType="java.lang.String" length="80" name="Name" nullable="1" type="xs:string"/>

                <xs:element dbName="sort" javaType="java.lang.Integer" length="7" name="Sort" nullable="1" type="xs:integer"/>

                <xs:element dbName="sys_del" javaType="java.lang.String" length="2" name="SysDel" type="xs:string"/>

                <xs:element dbName="sys_dlm" javaType="java.util.Date" length="19" name="SysDlm" type="xs:date"/>

                <xs:element dbName="sys_doc" javaType="java.util.Date" length="19" name="SysDoc" type="xs:date"/>

                <xs:element dbName="sys_klm" javaType="java.lang.Integer" length="10" name="SysKlm" type="xs:integer"/>

                <xs:element dbName="sys_koc" javaType="java.lang.Integer" length="10" name="SysKoc" type="xs:integer"/>

                <xs:element dbName="sys_pk" javaType="java.lang.Integer" length="10" name="SysPk" type="xs:integer"/>

                <xs:element dbName="sys_state" javaType="java.lang.Integer" length="3" name="SysState" type="xs:integer"/>

            </xs:sequence>

        </xs:complexType>

        <xs:key autoIncrement="1" dbName="primary" name="PRIMARY">

            <xs:selector xpath="TLanguages"/>

            <xs:attribute xpath="SysPk"/>

        </xs:key>

    </xs:element>

</xs:schema>

0 Kudos

Herr Jodeleit meinte, dass sie sich das fehlende XML für die Views selbst zusammen bauen können. Dabei können Sie sich an der Definition für die bestehende Tabelle orientieren. Ggf. hilft auch Rough description of FirstSpirit internal database structures etwas weiter.

Als Alternative könnten sie noch folgendes probieren, sofern sie selbst Views definieren können:

Bauen Sie einen View, der den momentanen View entspricht, zusätzlich aber einen JOIN mit einer anderen Tabelle enthält, welche einen Primary Key besitzt. Vielleicht klappt es dann.

0 Kudos
klein
Crownpeak employee

>das fehlende XML für die Views selbst zusammen bauen können

genau das wurde nun erfolgreich gemacht und nach folgender Syntax:

---------------------------

<xs:complexType dbName="my_view" name="my_view" readonly="1">

<xs:sequence>

<xs:element dbName="column0" javaType="java.lang.Integer" length="10" name="column0" type="xs:integer"/>

<xs:element dbName="column1" javaType="java.lang.String" length="255" name="column1" nullable="1" type="xs:string"/>                               

<xs:element dbName="column2" javaType="java.lang.Long" length="19" name="column2" nullable="1" type="xs:long"/>

</xs:sequence>

</xs:complexType>

<xs:key dbName="primary" name="PRIMARY">

<xs:selector xpath="my_view"/>

<xs:attribute xpath="column0"/>

</xs:key>

---------------------------

Was nur noch bleibt: die möglichen Änderungen in dem View "automatisch" (über eine eigene Implementierung) nach FirstSpirit zu übernehmen.

Danke für die Klarstellung.

Als Alternative könnten sie noch folgendes probieren, sofern sie selbst Views definieren können:

Kann man sich sparen, Views werden generell nicht unterstützt.

Peter
0 Kudos

Durch die externe Bearbeitung des XML-Schemas klappt es nun wunderbar Views - egal ob sie nun tatsächlich einen Primary Key haben oder nicht - im CMS anzubinden.

Hierzu bearbeite ich das XML-Schema, kopiere mir einen bereits vorhanden XML-Eintrag (complexType) und passe die Felder entsprechend dem gewünschten View an.

Was mir noch aufgefallen ist und für andere User vielleicht auch hilfreich

  • Views erscheinen nicht automatisch
  • Beziehungen zwischen Tabellen erscheinen nur, wenn die Tabellen vom Typ InnoDB sind.
  • Beziehungen zwischen Tabellen vom Typ MyISAM erscheinen NIE automatisch, können aber manuell ergänzt werden.
0 Kudos