2010-12-30

Besitzer einer Datenbank ändern

Dieser Post ist mehr eine Gedächtnisstütze für mich selbst, da ich immer wieder vergesse, wie man den Besitzer einer Datenbank (oder allgemeiner: den Besitzer eines Objekts in SQL Server) ändert.
Ein Weg führt über die gespeicherte Prozedur sp_changedbowner, die aber als veraltet gekennzeichnet ist und nicht mehr verwendet werden sollte.
Der elegantere (und allgemeingültige) Befehl ist:
ALTER AUTHORIZATION ON ... TO ...

Die folgende Zeile ändert also den Besitzer der Datenbank DemoDB nach DemoLogin :

ALTER AUTHORIZATION ON DATABASE::DemoDB TO DemoLogin

Eine Auflistung aller Objekttypen und weitere Beispiele finden Sie in der SQL Server Dokumentation:
http://msdn.microsoft.com/de-de/library/ms187359(v=SQL.105).aspx

2010-12-06

UPDATE mit JOIN

SQL können wir wie ein Baukastensystem nutzen: Die Syntaxelemente lassen sich in vielfältiger Weise kombinieren, um die gewünschten Operationen auf unseren Daten auszuführen. Manchmal allerdings ist die Kombination etwas gewöhnungsbedürftig. Das UPDATE mit JOIN ist so eine spezielle, aber sehr nützliche Kombination.

Aufgabenstellung:
Es gibt eine Tabelle Artikel, die für jeden Artikel unter anderem eine Artikelnummer und einen Preis enthält.
Außerdem gibt es eine Tabelle NeuePreise, die neue Preise für einige Artikel enthält.
Nun sollen mit einem Update alle Artikel, für die es neue Preise gibt, aktualisiert werden.

Lösung:
Der folgende Code zeigt dieses Szenario. Das Update finden Sie am Ende des Codeabschnitts.

create table Artikel
(
  ArtikelNr int primary key,
  Name nvarchar(100),
  Preis decimal(7,2)
)
-- Wir tragen 3 Artikel ein:
insert into Artikel (ArtikelNr, Name, Preis) values
  (1, 'Artikel 1', NULL),
  (2, 'Artikel 2', 1.0),
  (3, 'Artikel 3', 30.0)

create table NeuePreise
(
  ArtikelNr int primary key,
  Preis decimal(7,2)
)
-- Jetzt geben wir für Artikel 1 und 2 jeweils einen neuen Preis an:
insert into NeuePreise (ArtikelNr, Preis) values
  (1, 10.0),
  (2, 20.0)

-- Ab hier aktualisieren wir die Preise
select * from Artikel  -- Daten vor dem Update
update a
  set a.Preis = n.Preis
  from Artikel as a inner join NeuePreise as n
    on a.ArtikelNr = n.ArtikelNr
select * from Artikel  -- Daten nach dem Update
 
Wie Sie sehen, wird erst ein Join zwischen Tabelle Artikel (a) und NeuePreise (n) gebildet. Diese Datenmenge enthält nur Datensätze, für die es neue Preise gibt (inner join). Für jeden dieser Datensätze wird nun das Update so durchgeführt, dass a.Preis den Wert von n.Preis erhält.
 
Eigentlich ganz einfach, oder?

Noch eine Anregung: Auf die gleiche Weise können Sie auch DELETE Anweisungen bauen.