warum benötigen zusammengesetzte fremdschlüssel eine separate eindeutige einschränkung?
<p>hier ist eine einfache tabelle, in der datensätze auf übergeordnete datensätze in derselben tabelle verweisen können:</p><pre><code>create table foo ( id serial primary key, parent\_id int null, num int not null, txt text null, foreign key (parent\_id) references foo(id) ); </code></pre><p>mit der zusätzlichen anforderung, dass einer der anderen feldwerte (<code>num</code>) zwischen übergeordneten und untergeordneten datensätzen identisch sein muss, dachte ich, dass ein zusammengesetzter fremdschlüssel den trick machen sollte. ich habe die letzte zeile in geändert</p><pre><code> foreign key (parent\_id, num) references foo(id, num) </code></pre><p>und got <em>fehler: es gibt keine eindeutige einschränkung für die angegebenen schlüssel für die referenzierte tabelle "foo"</em>.</p><p>ich kann diese einschränkung leicht hinzufügen, verstehe aber nicht, warum dies erforderlich ist, wenn eine der referenzierten spalten (<code>id</code>) bereits eindeutig ist. so wie ich es sehe, wäre die neue einschränkung überflüssig.</p>
<p>es ist eine einschränkung des dbms - soweit ich weiß in allen. und das nicht nur beim hinzufügen einer spalte, sondern auch beim neuanordnen von spalten. wenn wir eine <code>unique</code> -einschränkung für <code>(a1, a2)</code> haben, können wir keine <code>foreign key</code> hinzufügen, die <code>references (a2, a1)</code>, es sei denn, es gibt eine eindeutige einschränkung für diese <code>(a2, a1)</code> das ist im wesentlichen redundant.</p><p>es wäre nicht besonders schwierig, dies als feature hinzuzufügen:</p><blockquote> <p>wenn es eine <code>unique</code> -einschränkung für <code>(a)</code> gibt, ist auch jede <code>(a, b, c, ..., z)</code> oder <code>(b,c, ...a, ...z)</code> kombination garantiert <code>unique</code>.</p> </blockquote><p>oder die verallgemeinerung:</p><blockquote> <p>wenn für <code>(a1, a2, ..., an)</code> eine <code>unique</code> -einschränkung besteht, ist auch jede <code>(a1, a2, ..., an, b1, b2, ..., bm)</code> - kombination oder neuanordnung <code>unique</code> garantiert.</p> </blockquote><p>es scheint, dass es nicht gefragt wurde oder nicht als hoch genug eingestuft wurde, um implementiert zu werden.</p><p>sie können jederzeit - im jeweiligen kanal - eine anfrage für die zu implementierende funktion stellen. oder implementieren sie es sogar selbst, wenn das dbms open source ist, wie postgres.</p>
<p>hinweis: ab azure sql database v12 gelten diese einschränkungen nicht mehr.</p><p>das ist kein "primärindex". es gibt so etwas wie einen "primärschlüssel" und es gibt auch so etwas wie einen "clustered index". unterschiedliche konzepte, oft verwirrt. lassen sie uns angesichts dieser unterscheidung die frage noch einmal betrachten:</p><p>q1) kann der clustered-index in einer sql azure-tabelle geändert werden?<br> a: ja. verwenden sie <code>with (drop\_existing=on)</code>:</p><pre><code>create table friend ( userid int not null, id int not null); go create clustered index cdxfriend on friend (userid, id); go create clustered index cdxfriend on friend (id, userid) with (drop\_existing=on); go </code></pre><p>f2) kann der clustered-index einer tabelle mit einer primärschlüsseleinschränkung geändert werden?<br> a: ja, wie oben, solange die primärschlüsseleinschränkung nicht über den clustered-index erzwungen wird:</p><pre><code>create table friend ( userid int not null, id int not null identity(1,1), constraint pk\_friend primary key nonclustered (id)); create clustered index cdxfriend on friend (userid, id); go create clustered index cdxfriend on friend (id, userid) with (drop\_existing=on); go </code></pre><p>f3) kann die primärschlüsseleinschränkung einer tabelle geändert werden?<br> a: ja, solange die primäre einschränkung nicht über den clustered-index erzwungen wird:</p><pre><code>create table friend ( userid int not null, id int not null identity(1,1), constraint pk\_friend primary key nonclustered (id)); go create clustered index cdxfriend on friend (userid, id); go alter table friend drop constraint pk\_friend; alter table friend add constraint pk\_friend primary key nonclustered (userid) go </code></pre><p>f4) kann der primärschlüssel einer tabelle geändert werden, wenn er über den clustered-index erzwungen wird?<br> a: ja, wenn die tabelle nie zeilen hatte:</p><pre><code>create table friend ( userid int not null, id int not null identity(1,1), constraint pk\_friend primary key clustered (userid, id)); go alter table friend drop constraint pk\_friend; alter table friend add constraint pk\_friend primary key clustered (id, userid) go </code></pre><p>f5) kann der primärschlüssel einer tabelle geändert werden, wenn er über den clustered-index erzwungen wird, wenn die tabelle gefüllt ist?<br> a: nein. jede operation, die einen aufgefüllten clustered-index in einen heap konvertiert, wird in sql azure blockiert <em>, auch wenn die tabelle leer ist </em>:</p><pre><code>create table friend ( userid int not null, id int not null identity(1,1), constraint pk\_friend primary key clustered (userid, id)); go insert into friend (userid) values (1); delete from friend; go alter table friend drop constraint pk\_friend; </code></pre><p>als randnotiz: die einschränkung kann geändert werden, wenn die tabelle <em> abgeschnitten ist </em>.</p><p>die problemumgehung zum ändern der pk-einschränkung einer aufgefüllten tabelle besteht darin, das gute alte <a href="http://msdn.microsoft.com/en-us/library/ms188351.aspx"><code>sp\_rename</code></a> trick:</p><pre><code>create table friend ( userid int not null, id int not null identity(1,1), constraint pk\_friend primary key clustered (userid, id)); go insert into friend (userid) values (1); go create table friendnew ( userid int not null, id int not null identity(1,1), constraint pk\_friend\_new primary key clustered (id, userid)); go set identity\_insert friendnew on; insert into friendnew (userid, id) select userid, id from friend; set identity\_insert friendnew off; go begin transaction exec sp\_rename 'friend', 'friendold'; exec sp\_rename 'friendnew', 'friend'; commit; go sp\_help 'friend'; </code></pre><p>das <code>sp\_rename</code> ansatz hat einige probleme, vor allem, dass berechtigungen für die tabelle während des umbenennens nicht übertragen werden, sowie fremdschlüsseleinschränkungen.</p> <p>wenn dies meine entwurfsentscheidung wäre, würde ich wahrscheinlich eher eine option c (modifizierte option a) wählen.</p><h3>erstens, warum nicht 'option b':</h3><p>zum einen gefällt mir die klarheit, dass jedes produkt seinen eigenen tisch hat. wenn es sich nur um eine große tabelle mit einem feld zur bestimmung des typs handelt, ist die beziehung nicht so klar.</p><p>zum anderen würde die indizierungsstrategie immer erfordern, dass dieses typfeld aufgelistet wird. da es sich nur um 4 typen handelt, ist die indexkardinalität extrem niedrig (<code>select * from product\_table where type='x'</code> führt im grunde sowieso einen vollständigen tabellenscan durch)</p><h3>option c.</h3><ul> <li>erstellen sie eine übergeordnete tabelle, die nur die spalten enthält, die alle typen gemeinsam nutzen</li> <li>erstellen sie jeden produkttyp als eigene tabelle mit ihren einzelnen spalten, mit einem zusätzlichen: ein link zur übergeordneten tabelle</li> <li>erstellen sie jede 'link'-tabelle: product\_option, model\_option usw. mit links zu den jeweiligen schlüsseln.</li> <li>für diejenigen mit wechselseitigen links (model\_option, option\_model) erstellen sie auch diese tabellen. dies erhöht die klarheit ihrer joins für alle, die sich das ansehen.</li> </ul><p>der nachteil ist die komplexität, sicherzustellen, dass waisen vermieden werden, wenn dinge aktualisiert/gelöscht werden, und zunächst die abfragen zu entwerfen, die diese tabellen verwenden.</p> was soll man denn da verständlich erklären? es gibt da einzelne standards mit 200 oder gar mehr seiten...wie willst du dir da einen schnellüberblick verschaffen? 

die standards wurden von einem privaten standardsetter (dem iasb) festgesetzt, mit der groben zielsetzung im hinterkopf, die rechnungslegung möglichst transparent und die bewertung möglichst am zeitwert/marktwert ("fair value") orientiert zu gestalten. der hintergedanke war, dem kapitalanleger (den an diesen richten sich die standards vornehmlich) durch diese art der bewertung (die sich stark an den amerikanischen us-gaaps orientiert) ein möglichst umfassendes und zeitnahes abbild des unternehmes zu verschaffen. 

der kerngedanke dahinter ist ja gar nicht verkehrt, nur wird dem ersteller eines abschlusses nach ifrs ein sehr hoher zeitlicher (und auch monetärer) aufwand abverlangt, da die bereitstellung der vielzahl der geforderten informationen (insbesondere in den notes) sich schon sehr aufwendig gestalten kann....

für weitere lektüre: schau einfach mal bei wikipedia unter den ifrs nach hallo,

jeder kann eine verschlüsselung entwickeln, die er selbst nicht brechen kann. das bedeutet allerdings keinesfalls, das diese sicher ist und einer cryptoanalyse standhält.

das erste, was mir an deinem chiffrierten text auffällt, ist das er nicht wirklich zufällig ist. verschlüsselte daten so… Hallo savest8 (André),

gerade Studenten sollen doch wissen, dass jede **endliche Reihe ohne Angabe von Randbedingungen durch unendlich viele Algorithmen "hingebastelt"** werden können. (das Summenzeichen ist ja hier irrelevant)

(unter <http://www.gerdlamprecht.de/Zahlenfolgen.html> zig Beispiele dafür)

Es kann doch nicht sein, dass die intelligenteren Studenten, die mehr Algorithmen (Funktionen usw.) kennen als andere, dann bestraft werden, nur weil "ihre Gedanken" etwas komplexer  waren als bei anderen... 

OK, Nachkommastellen-Algorithmen oder Pseudo-Zufallsgenerator-Algorithmen kann man wohl ausschließen.

( Im Gegenteil, ich würde Studenten Extra-Punkte vergeben, wenn sie neben einer primitiven noch eine andere Lösung finden... )

Die **Angabe von Randbedingungen** halte ich als **ganz wichtige Angabe einer "sauberen Aufgabenstellung"**!

Beispiele:

- Angabe, ob Brüche gekürzt sind (wurde ja schon genannt)

- Angabe, ob Interpolationspolynom (will man dies nicht explizit nennen, kann dies auch indirekt erfolgen, wenn durch Angabe der maximalen (Ganz-)Zahl im Algorithmus & genügen viele Glieder ein Polynom ausgeschlossen wird; Beispiel oben taucht ja die Zahl 9193 auf -> die Randbedingung "im Algorithmus keine Ganzzahlen über 99" oder Maximalzahl von Operatoren & Funktionen... Beispiel: (k(k(k(491*k-3842)+9193)-6610)+192)/192 )

- Angabe, ob höhere Funktionen beteiligt, sonst kommt noch so etwas:

(k(k(7k(271k-2266)+35507)-8102)+960)*Bernoulli(2k+2)/160
  


<http://www.wolframalpha.com/input/?i=table+(k(k(7k(271k-2266)%2B35507)-8102)%2B960)*bernoulli(2k%2B2)%2F160,k%3D0...4>
  


Die Angabe der maximalen Operatoren/Funktionen oder Klammern ist auch wichtig, um Lösungen wie

(2k(k((k-4)k+8)-2)+3)/3*(-1)^k/k!
  


{ LINK: <http://www.wolframalpha.com/input/?i=table++(2k(k((k-4)k%2B8)-2)%2B3)%2F3*(-1)%5Ek%2Fk!,k%3D0...4>

} auszuschließen.

Sonderrolle spielen Primzahlen. Manchmal bereits in der Grundschule erwartet...

einige Programme haben sie integriert {WolframAlpha kennt Prime(x) }

... eine exakte Formel wie <http://www.lamprechts.de/gerd/php/Formeln/Formel-7.png>

wird nie in Aufgaben abgefragt werden...

Was generell viele falsche Gedankengänge vertreiben hilft, sind mehr als 5 Glieder in der Aufgabenstellung.

wenn da noch -243/120 steht, **sieht man schneller**, dass:

- Vorzeichen immer wechselt

- hier nicht gekürzt wurde

- 120 bei der Fakultät auftaucht

- das Interpolationspolynom kaum noch mit üblichen Faktoren dargestellt werden kann (Taschenrechnergenauigkeit reicht nicht mehr) man konnte es bisher auch nicht sperren und im grunde ist es, wegen dem handshake-verfahren, auch nicht wirklich nötig.

 

dennoch haben wir jetzt eine möglichkeit gefunden eine sperre individuell einzurichten.

 

das ist doch gut, oder etwa nicht? :relaxed: <p>es ist keine schwäche für einen kurzen oder langen öffentlichen exponenten für rsa bekannt, solange der öffentliche exponent "korrekt" ist (dh relativ prim zu <em> p-1</em> für alle primzahlen <em> p </em> welche den modul teilen).</p><p><em> if</em> sie verwenden einen kleinen exponenten <em> und</em> sie verwenden kein padding für die verschlüsselung <em> und</em> sie verschlüsseln genau dieselbe nachricht mit bei mehreren unterschiedlichen öffentlichen schlüsseln ist ihre nachricht gefährdet: if <em> e = 3</em> und sie verschlüsseln die nachricht <em> m</em> mit öffentlichen schlüsseln <em> n<sub>1</sub></em>, <em> n<sub>2</sub></em> und <em> n<sub>3</sub></em>, dann hast du <em> c<sub>ich</sub> = m<sup>3</sup></em> mod <em> n<sub>ich</sub></em> für <em> i = 1</em> bis <em> 3</em>. mit dem <a href="http://en.wikipedia.org/wiki/chinese\_remainder\_theorem">chinesischer restsatz</a> können sie dann <em> m<sup>3</sup></em> mod <em> n<sub>1</sub>n<sub>2</sub>n<sub>3</sub></em>, was sich als <em> m herausstellt<sup>3</sup></em> (ohne modulo) weil <em> n<sub>1</sub>n<sub>2</sub>n<sub>3</sub></em> ist eine größere ganze zahl. eine (nicht modulare) kubikwurzelextraktion reicht dann aus, um <em> m</em> zu extrahieren.</p><p>die schwäche ist hier <strong> nicht </strong> der kleine exponent; vielmehr ist es die verwendung einer falschen auffüllung (nämlich überhaupt keine auffüllung) für die verschlüsselung. das auffüllen ist für die sicherheit von rsa sehr wichtig, egal ob verschlüsselung oder signatur. wenn sie keine ordnungsgemäße polsterung verwenden (wie die in <a href="http://www.rsa.com/rsalabs/node.asp?id=2125">pkcs # 1</a> beschriebenen), haben sie viele schwächen, und die im obigen absatz beschriebene ist bei weitem nicht die größte. wenn sich jemand jedoch auf eine schwäche im zusammenhang mit der exponentengröße bezieht, bezieht er sich mehr oder weniger direkt auf dieses ereignis. das ist ein bisschen alte und falsche überlieferung, die manchmal in ein verbot gegen <em> groß</em> exponenten umgewandelt wird (da es sich um einen mythos handelt, ist der umgekehrte mythos auch ein mythos und nicht mehr - und nein weniger begründet); ich glaube, das beobachten sie hier.</p><p>es gibt jedoch einige gründe, warum ein großer öffentlicher exponent vermieden werden sollte:</p><ul> <li> <p>kleine öffentliche exponenten fördern die effizienz (für public-key-operationen).</p> </li> <li> <p>es gibt sicherheitsprobleme, wenn ein kleiner exponent <em> privat</em> vorhanden ist. ein schlüsselwiederherstellungsangriff wurde beschrieben, wenn die länge des privaten exponenten nicht mehr als 29% der länge des öffentlichen exponenten beträgt. wenn sie erzwingen möchten, dass der private exponent kurz ist (z. b. um operationen mit privaten schlüsseln zu beschleunigen), müssen sie mehr oder weniger einen großen öffentlichen exponenten verwenden (so groß wie der modul). die forderung, dass der öffentliche exponent kurz sein muss, kann dann als eine art indirekte gegenmaßnahme angesehen werden.</p> </li> <li> <p>einige weit verbreitete rsa-implementierungen drosseln große öffentliche rsa-exponenten. z.b. der rsa-code in windows (cryptoapi, von internet explorer für https verwendet) besteht darauf, den öffentlichen exponenten in einem einzelnen 32-bit-wort zu codieren. es kann keinen öffentlichen schlüssel mit einem größeren öffentlichen exponenten verarbeiten.</p> </li> </ul><p>dennoch sieht "risiken können groß sein" wie die allgemeine rechtfertigung aus ("dies ist ein sicherheitsproblem" ist die übliche art zu sagen "wir haben es nicht implementiert, aber wir wollen keine art von faulheit zugeben").</p> Manche Banken fragen nach diesen Daten, wenn eine Auslandsueberweisung gemacht werden soll. Hatte ich (geschaeftlich) auch schon, dass Kunden diese Daten benoetigt haben. Warum manche Banken das wollen und andere nicht, kann ich Dir allerdings auch nicht sagen. Sicherheitsverwahrung ist ja gerade kein Gefängnis. Die dort untergebrachten Straftäter haben einige Privilegien (z.B. bei der Einrichtung ihrer Unterkunft)


Und regelmäßig wird überprüft, ob der Grund für die Sicherheitsverwahrung fortbesteht. @bibabumsebaer: Ich habe perfekte Passwörter aus Groß- und Kleinbuchstaben und Zahlen wild durcheinander. Für VISA habe ich Sonderzeichen eingestreut und trotzdem habe ich das gleiche Problem: Nie wird eines der eingegenen Passwörter akzeptiert.
Weiß jemand Rat?