Und mal wieder etwas aus der Kategorie „KostNix“: Bei Microsoft gibt es ab sofot das eBook „Introducing Microsoft SQL Server 2008“ für lau zu haben.

Ein Blick in das Inhaltsverzeichnis verspricht einige interessante Theme:

Introducing Microsoft SQL Server 2008:
Chapter 1: Security and Administration
Chapter 2: Performance
Chapter 3: Type System
Chapter 4: Programmability
Chapter 5: Storage
Chapter 6: Enhancements for High Availability
Chapter 7: Business Intelligence Enhancements

Nachteil: man muss sich für das Buch bei Microsoft registrieren. Wer das nicht möchte, kann sich zumindest das erste Kapitel anschauen :)

[via mynethome.de]

Und mal wieder etwas aus der Kategorie „KostNix“:

Der O’Reilly Verlag hat mit „Sicherheit im Internet“ und „Praktischer Einstieg in MySQL mit PHP“ wieder zwei Bücher als Openbooks veröffentlicht. Damit stehen nun fast 40 OpenBooks in Englisch bzw. Deutsch – größtenteils unter Open Source-Lizenzen wie der GNU Free Documentation License, Open Publications License oder der GNU General Public License – auf der O’Reilly Webseite für jedermann kostenlos zur Verfügung.

Nicht gerade Literatur für mich, aber vor allem das erste Werk scheint mir recht Nützlich für ein paar Freund und Bekannten von mir zu sein – ein paar Nützliche Tips können ja nie schaden und ersparen mir dann vielleicht die eine oder andere immer wiederkehrende Frage/Antwort Spielerei :)

[via Pro-Linux]

Dietmar Rabich hat für seine beiden Plugins Database Tuning und Meta Information ein Update herausgebracht, so dass diese nun auch mit der aktuellen WordPress-Version 2.3 zusammenspielen.

Und somit läuft auch endlich das letzte Plugin in meinem Blog unter WP2.3. Bleibt mir eigentlich nur noch zu sagen: Keep up the good work! :)

Will man in einer SQL-Tabelle Werte ersetzen, so ist dieses ja eigentlich sehr einfach und lässt sich, sofern nur der Wert selber im entsprechenden Feld steht, über eine simple UPDATE-Query erledigen.

Etwas komplexer wird die ganze Angelegenheit, wenn man, z.B. weil sich z.B. ein Produktname aber nicht die Bezeichnung geändert hat, nur ein Wort in einem Feld austauschen muss.

Lösen lässt sich das über eine kleine SQL Abfrage:

DECLARE @suchen varchar (255)
DECLARE @ersetzen varchar (255)
DECLARE @findus varchar (255)

SELECT @suchen = ‚Altername‘
SELECT @ersetzen  = ‚Neuername‘
SELECT @findus = ‚%‘ + @suchen + ‚%‘

UPDATE
    [Tabellenname]
SET
    [Feldname] = STUFF([Feldname], PATINDEX(@findus, [Feldname]), DATALENGTH(@suchen), @ersetzen)
WHERE
    [Feldname] LIKE @findus

Das Beispiel durchsucht nun eine nvarchar-Spalte Feldname in der Tabelle Tabellenname und ersetzt dort das Wort Altername durch das Wort Neuername.

Auf Milw0rm wurde ein Exploit für eine Remote SQL-Injection für das Blogsystem WordPress veröffentlicht, mit der Angreifer eigene Befehle an die Datenbank von WordPress übergeben und so Inhalte manipulieren oder Namen und Passwort-Hashes anderer Nutzer auslesen können.

Verursacher ist die Funktion wp.suggestCategories im Modul xmlrpc.php, die übergebene Parameter nicht richtig filtert und so beliebige SQL-Aufrufe an die Datenbank weitergibt.

Der Fehler betrifft wahrscheinlich alle WordPress-Versionen bis einschließlich 2.2. Zwar lässt sich der Exploit nur als angemeldeter Nutzer ausnutzen, Anwender sollten aber ASAP das Update der xmlrpc.php aus den Entwickler-Repositories einspielen.

Wer es lieber händisch mag, muss in der Zeile 541

$max_results = $args[4];

gegen

$max_results = (int) $args[4];

austauschen … zumindest passt dieses auf die xmlrpc.php der Version 2.2. Wie der Code in den Versionen < 2.2 aussieht, kann ich IMO leider nicht sagen.

Gerade bin ich auf das WordPress (WP) Plugin „Database Tuning“ von Dietmar Rabich gestoßen. Das Plugin ist ein kleiner Wartungs- und Optimierungshelfer für die Tabellen und Indizes der WP-Datenbank. Zusätzlich können noch weitere Indizes zur Steigerung der Performance angelegt werden.

Rein subjektiv läuft mein WP nach einem Durchlauf (ohne alternative Indizes) eine ganze Ecke schneller, aber wie gesagt, rein subjektiv. Leider fehlt mir IMO die Zeit, die Optimierung mit den alternativen Indizes noch etwas gründlicher zu testen, doch das Plugin gehört auf jeden Fall in die Katorgorie „MustHave“. Aber Achtung, vor der Optimierung ein DB-Backup nicht vergessen … man weiss ja nie :)

Will man bei einer Datenbank eines MS SQL-Servers die Besitzrechte aller Datenbanken ändern, so kann man dieses bekannter weise über „Rechtsklick->Alle Tasks->Berechtigungen verwalten“ erledigen.

Soll der Besitzer aller Tabellen einer Datenbank geändert werden, ist dieses Vorgehensweise allerdings suboptimal. Besser und vor allem schneller geht es in einer solchen Situation mit

sp_MSForEachTable ’sp_changeobjectowner ‚‚?‘‚,‘‚NeuerBesitzer‘

Leider funktioniert diese Methode nicht bei Stored Procedures (SP), hier reicht es allerdings aus, für alle SP ein SQL-Script zu generieren und überall, wo der Benutzer mittels setuser gesetzt wird, diesen gegen den neuen Benutzer auszutauschen (setuser N’NeuerBesitzer‘).

Geht eigentlich ganz einfach wenn man weiß wie:

SELECT column_name FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = ‚foo‘

Alle, und ich meine wirklich alle, Tabellennamen, Spaltennamen sowie deren Datentyp und Länge kann man sich übrigends mit

SELECT
        table_name=sysobjects.name,
        column_name=syscolumns.name,
        datatype=systypes.name,
        length=syscolumns.length
FROM
        sysobjects
                JOIN syscolumns ON sysobjects.[id] = syscolumns.[id]
                JOIN systypes ON syscolumns.xtype=systypes.xtype
WHERE
        sysobjects.[xtype]=‚U‘
ORDER BY
        sysobjects.[name],
        syscolumns.colid

ausgeben lassen … aber das nur mal am Rande :)

Ein Array kann man bekannter Maßen nicht an eine Stored Procedure übergeben. Notnagel wäre an dieser Stelle eine kommaseparierte Liste von String-Parametern als IN-Parameter.

Einen interessanten Ansatz dazu hat Daniel Müller in seinem .NET – Software & DotNetNuke (DNN) Blog gefunden. Mittels einer User Defined Function(UDF) macht er aus den nvarchar Parameter eine „Tabelle“, die er dann ohne ohne Probleme mit dem IN Parameter verarbeiten kann.

Natürlich ist hier nicht nur ein select-Statement denkbar. Mittels einem Cursor läßt sich mit dem Ergebnis auch eine weitere Stored Procedure ansprechen und die gefunden Daten z.B. in eine andere Tabelle abspeichern.

SET @ItemIDs = ‚1,2,3,4,5,6,7‘
SET @MitarbeiterID = ’23‘

DECLARE Item_cursor CURSOR FOR
        SELECT   @MitarbeiterID AS MitarbeiterID, [id] AS @ItemID FROM fn_Split_varcharToint(@ItemIDs)

OPEN Item_cursor

— Perform the first fetch.
FETCH NEXT FROM Item_cursor
INTO @MitarbeiterID, @ItemIDs

— Check @@FETCH_STATUS to see if there are any more rows to fetch.
WHILE @@FETCH_STATUS = 0
BEGIN
   IF(@MitarbeiterID != 0 AND @ItemIDs != 0)
        BEGIN
                EXEC My_Custom_Stored_Procedure @MitarbeiterID, @ItemIDs
        END
   FETCH NEXT FROM Item_cursor
        INTO  @MitarbeiterID, @ItemIDs
END

CLOSE Item_cursor
DEALLOCATE Item_cursor

Zugegeben, ein Cursor ist nicht gerade etwas, was man häufig verwenden sollte, aber dieses Blog ist ja auch kein SQL Lehrbuch *G*

Eine Volltextsuche war unter MySQL bislang nur mit MyISAM-Tabellen möglich, wobei dieser Tabellentyp allerdings keine Transaktionen oder Fremdschlüsselbeziehungen kennt. Das kostenlose PlugIn Sphinx schaft nun abhilfe und erlaubt sämtliche von MySQL angebotene Tabellentypen, wie z.B. InnoDB, zu durchsuchen.

Das unter der GPL veröffentlichte Plugin nutzt dabei einen eigenen Prozess zum Durchsuchen der MySQL-Tabellen und bietet zudem Such-Features wie “match all”, “match any” oder “phrase”. Laut den Entwicklern sollen sich bis zu 100 Gb an Texten relativ performant durchsuchen lassen (auf einer einzelnen CPU) und die Geschindigkeit einer Anfrage soll bei unter 0.1 Sek/4 GB Text liegen. Über eine generische XML Schnittstelle soll zudem die Integration und Anpassung vereinfach werden.

Ab MySQL 5.0.22 läßt sich Sphinx übrigends auch als eigener Tabellentyp in die Datenbank-Engine impelementieren, wobei die Suche dann durch einen externen Daemon durchgeführt wird.

[via mysqlperformanceblog.com]