Lazy Proxies mit Reflection.Emit 25.04.2012

Sebastian Weber
Sebastian Weber, Senior eXpert

Man kommt immer wieder in die Situation, eine bestimmte Funktionalität in einer Serviceklasse zu kapseln (z.B. den Zugriff auf eine Datenbank oder das Dateisystem). Eine solche Serviceklasse on-demand zu instanziieren kann Ressourcen sparen. Doch das Wissen um den Aufwand, den eine Objekterzeugung benötigt, sollte nicht bei allen Konsumenten des Diensterbringers aufschlagen. Eine für den Verwender vollkommen transparente Möglichkeit, diese Information auf die Konfiguration der Anwendung zu beschränken, bietet die dynamische Erzeugung von Klassen mittels Reflection.Emit.

Angenommen ich habe einen Service, beschrieben durch das Interface IMyContract und implementiert in der Klasse MyService. Die Instanziierung von MyService ist, aus welchen Gründen auch immer, sehr zeitaufwendig und/oder ressourcenfressend. Außerdem wird dieser Service zwar an mehreren Stellen benötigt, aber nicht unbedingt in jedem Fall. Z.B. könnte ein MessageHandler in Abhängigkeit vom Inhalt einer Nachricht diesen oder jenen Service aufrufen. Ich möchte also keine fertige Instanz des Service in alle potentiellen Konsumenten injizieren, weil der Aufwand zur Erzeugung des Service häufig nicht gerechtfertigt ist.

Eine Lösung wäre, eine Factory über den Konstruktor zu injizieren. Dies kann im einfachsten Fall ein Delegate vom Typ Func<IMyContract> sein. Diesen kann ich nutzen, um mir im Fall der Fälle eine Instanz des Service zu besorgen. Verwendet man jetzt noch Lazy<T>, dann kann man das Ganze sogar recht hübsch machen.

   1:  public class MyConsumer
   2:  {
   3:    private readonly Lazy<IMyContract> lazy;
   4:    public MyConsumer(Func<IMyContract> serviceFactory)
   5:    {
   6:      this.lazy = new Lazy<IMyContract>(serviceFactory);
   7:    } 
   8:    public IMyContract Service
   9:    {
  10:      get { return this.lazy.Value; }
  11:    } 
  12:    public void DoSomething()
  13:    {
  14:      this.Service.DoSomething();
  15:    }
  16:  }

Das hat aber einen entscheidenden Nachteil: Ich injiziere eine Factory, weil ich weiß, dass meine Implementierung von IMyContract teuer in der Erzeugung ist. Eine andere Implementierung hat diesen Pferdefuß vielleicht gar nicht. Das ist eine sogenannte leaky abstraction. Das Wissen über eine Implementierung steuert, wie diese Implementierung verwendet wird. Dadurch kann ich sie nicht mehr beliebig austauschen.

Eine saubere Lösung würde MyConsumer einfach eine Implementierung von IMyContract übergeben. Wir haben keine leaky abstraction mehr. Pattern eingehalten, Soll erfüllt.

Die Erzeugung von MyService ist aber nun mal teuer. Also schieben wir diese akademische Diskussion beiseite und wählen einen “pragmatischen” Ansatz.

Allerdings entstehen Pattern und Best Practices nicht ohne Grund. Darum lohnt es sich, hier ein wenig mehr Hirnschmalz zu investieren.

Wenn mir mein DI-Container einen Proxy generieren würde, der im Kern eine Kapselung von Lazy<T> ist, und der MyService wirklich nur dann instanziiert, wenn er tatsächlich gebraucht wird, hätte ich das Performance-Problem gelöst, die leaky abstraction vermieden und das Wissen um die Kosten von MyService wäre auf die Konfiguration des Containers beschränkt (also genau da, wo man solche Entscheidungen auch treffen sollte).

Mit den Interception-Mechanismen von Unity oder Castle DynamicProxy kann man sich etwas derartiges zurechtbiegen. Aber schön ist die Lösung nicht und schneller wird die Anwendung dadurch auch nicht. Wrapper für jeden Service in einer Anwendung von Hand zu kodieren oder mit Hilfe von T4-Templates zu generieren erfordert immer noch manuelle Eingriffe durch den Entwickler.

Doch das muss nicht sein! Durch den Einsatz von Reflection.Emit kann man den IL-Code für die Wrapper generieren. Damit kombiniert man die Performance der handgefertigten Wrapper mit dem Komfort der dynamisch erzeugten Proxies.

Einen guten Einstieg in die IL-Programmierung bieten zwei Artikel auf The Code Project.

Den Wrapper kann man einmal von Hand kodieren und sich dann mittels Reflector den zugehörigen IL Code anschauen. Danach geht es daran herauszufinden, wie sich etwas gleichwertiges generieren lässt. Das ist nicht ganz einfach und läuft im Endeffekt auf jede Menge trial-and-error hinaus. Aber das Ergebnis lohnt den Aufwand.

Der generierte Proxy sieht in etwa folgendermaßen aus:

   1:  public class MyContract_LazyInstantiationProxy : IMyContract
   2:  {
   3:    private readonly Lazy<IMyContract> lazy;
   4:    public MyConsumer(Func<IMyContract> serviceFactory)
   5:    {
   6:      this.lazy = new Lazy<IMyContract>(serviceFactory);
   7:    } 
   8:    public IMyContract Service
   9:    {
  10:      get { return this.lazy.Value; }
  11:    } 
  12:    public void DoSomething()
  13:    {
  14:      this.Service.DoSomething();
  15:    }
  16:  }

Er implementiert IMyContract. Kapselt die Erzeugung des tatsächlichen Diensterbringers in einem Lazy<IMyContract> und delegiert einfach die eingehenden Aufrufe. Durch eine Extension-Methode für IUnityContainer gestaltet sich die Registrierung am Container denkbar einfach:

   1:  IUnityContainer container = new UnityContainer();
   2:  container.RegisterLazyProxy(
   3:    x =>
   4:      {
   5:        x.Contract = typeof(IFooService);
   6:        x.ServiceImplementation = typeof(FooService);
   7:      });

Der Proxy muss keine Performanceverluste durch die Interception-Infrastruktur hinnehmen. Er ist genauso schnell wie selbstgeschriebener Code. Die Implementierung von IMyContract kann weiterhin beliebig ausgetauscht werden, es ist lediglich eine kleine Änderung in der Konfiguration des Containers notwendig.

Bei Interesse kann der Quellcode zum Beitrag auf CodePlex heruntergeladen werden. Der Generator liegt unter TecX.Unity.Proxies. Die zugehörigen Tests, die seine Verwendung demonstrieren, sind unter TecX.Unity.Proxies.Test zu finden.

Share |

SharePoint 2010 Deployment (Teil 2) – Wiederherstellen einer Backup-Datei 23.04.2012

Thomas Nissen
Thomas Nissen, BI eXpert

Bei SharePoint 2010 Deployment handelt es sich um eine Serie von Blogbeiträgen, die die verschiedenen Schritte für das Deployment von SiteCollections erläutert und ausführt. Dabei wird der Fokus auf das Wiederherstellen einer Backup-Datei aus einer SharePoint-Umgebung in eine andere (z.B. von einer Entwicklungsumgebung auf eine Test- oder Produktivumgebung) gelegt.

 

Die Serie “SharePoint 2010 Deployment” besteht aus den folgenden Beiträgen:

  1. Erstellen einer SiteCollection
  2. Wiederherstellen ein Backup-Datei
  3. Erstellen von SecureStore-Applikationen
  4. Importieren von Business Data Connectivity Models
  5. Deployment von SQL Server Reporting Services Reports

Im zweiten Teil dieser Blogserie behandeln wir das Wiederherstellen einer Backup-Datei in SharePoint 2010 mit Hilfe von Powershell. Dafür erweitern wir die, im ersten Teil der Blogserie, erstellte Konfigurationsdatei sowie das Powershell-Skript, um die Aktionen für das Wiederherstellen der Backup-Datei. Dieses Powershell-Skript kann entsprechend der Anforderungen individuell angepasst werden.

Für das Erweitern, der im ersten Teil der Blogserie erstellten Powershell-Datei, sowie das nachträgliche Ausführen sind die folgenden Schritte auszuführen:

  1. Erweitern der Konfigurationsdatei
  2. Erweitern der Powershell-Datei
  3. Ausführen

Erweitern der Konfigurationsdatei

Um ein unabhängiges Deployment zu verwenden, haben wir im ersten Teil dieser Blogserie Erstellen einer SiteCollection eine Konfigurationsdatei (Konfiguration.xml) erstellt. Diese müssen wir nun um den Pfad für die Backup-Datei erweitern.

<!--Paths-->
<BackupFilePath>Pfad zur Backup-Datei einfügen</BackupFilePath>

Erweitern der Powershell-Datei

Im nächsten Schritt erweitern wir, das im ersten Teil der Blogserie erstellte Powershell-Skript (Deployment.ps1) um das Element <BackupFilePath> aus der Konfigurationsdatei.

$BackupFilePath = $configurationElement.Config_Content.BackupFilePath

Im zweiten Schritt fügen wir dem Powershell-Skript dem Befehl zum Wiederherstellen der Backup-Datei in eine bestimmte SiteCollection hinzu.

#----- Restore the Site Collection -----
Write-Host "Restore Site Collection Start"
Restore-SPSite -Identity $newCollectionSite -Path "$BackupFilePath" -Force -Confirm:$false
Write-Host "Restore Site Collection End"

Beim Verwenden des Powershell-Befehls Restore-SPSite ist darauf zu achten, dass die Backup-Datei auf einem SharePoint-Server mit derselben oder einer höheren Versionsnummer wiederhergestellt wird. Andernfalls kann das Wiederherstellen der Backup-Datei nicht ausgeführt werden.

Ausführen

Öffnen Sie nun auf dem Server das Microsoft SharePoint 2010 Management Shell und navigieren zum dem Verzeichnis, in dem Sie die neu erstellten Dateien gespeichert haben.

Sie können das Skript auch mit dem von Windows Server mitgelieferten Powershell-Fenster ausführen. Hierzu müssen Sie jedoch noch die SharePoint spezifischen Methoden einbinden. Geben Sie dafür folgenden Befehl ein, bevor Sie das Deployment-Skript ausführen:

if((Get-PSSnapin -Name "Microsoft.SharePoint.PowerShell" - EA 0) -eq $null)
{
  Add-PSSnapin "Microsoft.SharePoint.PowerShell"
}

Um die SharePoint spezifischen Funktionen auch dauerhaft in der Windows Server mitgelieferten Powershell-Konsole nutzen zu können, finden Sie hier einen interessanten Blobeintrag von Kirk Evans.

Führen Sie das Powershell-Skript Deployment.ps1 aus. Anschließend sollte folgendes Fenster erscheinen:

image

Fazit

Zusammenfassend kann man sagen, dass sich mit Hilfe von Powershell in SharePoint 2010 einfach administrative und konfigurierbare Schritte ausführen lassen. Dieses bedeutet, insbesondere für Administratoren und Entwickler, eine erhebliche Zeitersparnis.

Ein Vorteil, welches das Wiederherstellen  einer Backup-Datei in eine SiteCollection gegenüber dem Copy-Befehlen für die einzelnen Listen, Bibliotheken, etc. hat, ist das die gesamten Security-Einstellungen mit übernommen werden. So kann man alle Einstellungen für die Berechtigungen auf Seiten, Listen, etc. bereits in der Entwicklungs- oder Testumgebung einstellen ohne sie auf dem produktiven SharePoint wiederholen zu müssen.

Im dritten Teil dieser Blogserie SharePoint 2010 Deployment beschäftigen wir uns mit dem Thema Erstellen von SecureStore-Applikationen.

Hier finden Sie eine Übersicht aller Blogbeiträge zu dieser Blogserie.

Teil 1                    Teil 2                    Teil 3                    Teil 4                    Teil 5

Share |

Quo vadis Kinect? 20.04.2012

Sven Willsch
Sven Willsch, Chief eXpert
 
Es ist gar nicht so lange her, da haben iPhone und iPad eine neue Generation von Endgeräten geprägt, Endgeräte die mittlerweise kaum noch aus unserem Alltag wegzudenken sind. Mit Ihnen kamen Buzzwords wie 'Swipen', 'Multi-Touch' oder einfach nur 'Apps' in unseren Sprachschatz. Und spätestens seit der Windows 8 Consumer Preview ist klar, all das wird uns künftig in unserem täglich im Business begegnen.
 
Jeder der im Microsoft-Umfeld innovativ sein möchte beschäftigt sich derzeit mit diesen Themen. Aber das erstaunliche daran ist eigentlich, dass es auf dem Zeitstrahl der IT gemessen bereits ein "alter Hut" ist. Zumindest wenn man den Launch des ersten iPhone im Jahr 2007 als Referenzpunkt nimmt. Fünf Jahre sind seither vergangen und ich habe immer noch diese gewissen Erinnerungen im Kopf, Erinnerungen daran wie viele Blackberry Benutzer damals nur ein müdes Lächeln für die neuen Touchgeräte übrig hatten.

Letztens da erging es mir ähnlich. Da überkam mich das Gefühl nicht ernst genommen zu werden als ich den Begriff Kinect in den Mund nahm. Ein leicht verschmitztes Lächeln zeichnete sich im Gesicht meines Gegenübers ab und eine Frage füllte lautlos aber doch einnehmend den Raum. Kinect und Business, das passt doch nicht zusammen, oder?

Zugegeben, dass Kind in mir lebt noch und als selbstverstandener Digital Native fragt man sich halt nach den Monaten der Euphorie, in denen man wild zappelnd vor dem Flatscreen im Wohnzimmer weilte, was da sonst noch alles möglich ist. Mit welchen Anwendungen kann man sich noch lächerlich machen, wenn die Nachbarn von gegenüber mal wieder ins heimische Wohnzimmer blicken?

Zumindest Microsoft hat hier in einer offiziellen Werbebotschaft die ein oder andere Idee parat:



Eines ist klar, die Zahlen für Kinect Respektive die Entertainmentsparte von Microsoft stellen mittlerweile mit 4,25 Mrd USD im letzten Quartal einen respektablen Anteil am Gesamtumsatz des Riesen aus Redmond dar.

Das Potential ist somit gegeben und der Wunsch die Kinect im Businessmarkt zu etablieren auch. Das kombiniert mit der Tatsache das Innovationen durch Contests wie dem Kinect Accelerator 2012 oder gar durch Projekte von Microsoft Research wie z.B. dem Holodesk gefördert werden, zeigt die Wichtigkeit und in welche Richtung es gehen kann.



Die Zukunft läßt also einiges erwarten, gerade auch weil in Kürze beim erscheinenden Kinect SDK 1.5 das Zusammenspiel mit dem PC forciert wird.

Sie sehen dass nicht so? Hand auf's Herz, haben Sie sich vor 15 Jahren mit einem Motorola 'Knochen' jemals vorstellen können über das gleiche Gerät Onlinebanking betreiben zu können oder es gar als vollständiges Navigationsgerät zu nutzen? Sicher nicht, oder?

In den folgenden Wochen bzw. Monaten werde ich das 'Spielzeug' Kinect in einer Reihe von Artikeln aufbohren. Ich werde anreißen wie der Sensor arbeitet, wie man dafür entwickelt, welche Möglichkeiten man hat und dabei immer mal wieder schauen was sich in Sachen Forschung und Markt tut.

Denn in einem bin ich mir sicher, Gesten und Sprachkontrolle werden unser Arbeitsumfeld nachhaltig verändern wenn auch die bewährten Geräte nach wie vor Anwendung finden. Vielleicht passiert dies nicht heute, morgen oder gar übermorgen, aber im Umfeld der IT ist eines sicher und das ist der stetige und mitunter schnelle Wandel.

Und auch hier werden wieder neue Buzzwords Einzug halten, dann 'swipen' wir mitunter in verstaubten Meetingräumen ganz ohne Tablet durch die neusten Umsatzzahlen, dann 'voicen' wir uns vielleicht durch die neusten Aktienkurse oder eine nette Stimme macht uns darauf aufmerksam dass wir ergonomisch gesehen mal wieder wie ein Schluck Wasser in der Kurve vor dem Rechner sitzen.

Meiner Meinung nach wird es in jedem Fall spannend.
Share |

Reparatur der Login/User Zuordnung im SQL Server 18.04.2012

Matthias Malsy
Matthias Malsy, Principal eXpert
Bei einem Restore einer SQL Server Datenbank aus einem Fremdsystem werden User und somit die Berechtigungen der Datenbank mit eingespielt. Diese Benutzer sind in der Regel mit keinem Login des Servers verknüpft, auch wenn Login und der Benutzer den gleichen Namen tragen. In der Konsequenz hat der Login keine Berechtigung auf der Datenbank.

Die Zuordnung von User und Login erfolgt über die sogenannte SID (Secure Identifier). Nur wenn diese bei Login und User gleich sind erfolgt sie automatisch. Dies ist in der Regel nur der Fall, wenn Login und User im gleichen System erstellt worden sind. Nachfolgender Artikel zu "SQL Server Logins and Users" beschreibt die Zusammenhänge im Detail.

Für die Praxis helfen zwei kleine Stored Procedures:

Auflisten der User die keine Verknüpfung zu Logins haben:
sp_change_users_login 'report'
 User einer Datenbank einem Login zuordnen:
sp_change_users_login 'update_one', '[Username]', '[Login]'
-- oder auch (Danke an Frank für den Tipp) 
ALTER USER [Username] WITH Login = [Login]
Share |

SQL Server Data Tools Power Tools 16.04.2012

Sylvio Hellmann
Sylvio Hellmann, Chief eXpert

Das Entwicklerteam der SQL Server Data Tools (SSDT) wird künftig Power Tools verwenden, um neue Funktionen in regelmäßigen Updates zur Verfügung zu stellen. Die erste Version dieser SSDT Power Tools stellt die logischen Ansicht des Datenbank-Schema eines SQL Server Projektes im SQL Server Objekt-Explorer dar.

Wenn Sie das Installationspaket (ssdtpowertools.vsix) von der Seite heruntergeladen haben, können Sie es ausführen (Doppelklick). Nach dem Start der Installation werden die Lizenzbedingungen angezeigt und Sie können festlegen, in welcher Visual Studio Umgebung Sie es installieren wollen.

image

Die Installation können Sie durch Klick auf die Installieren-Schaltfläche fortsetzen. Die Installation erfolgt sehr schnell und zum Abschluss wird eine Zusammenfassung angezeigt. Sollten Fehler während der Installation aufgetreten sein, so können Sie diese im Installationsprotokoll genauer untersuchen.

Nach der Installation dieser Power Tools finden Sie eine neue Erweiterung in Visual Studio. Den folgenden Dialog zum Aktivieren bzw. Deaktivieren von Erweiterungen finden Sie im Visual Studio unter dem Menüpunkt <Tools><Extension Manager>:

Extension

Sobald Sie die Erweiterung aktiviert haben, finden Sie im SQL Server Objekt Explorer (Menü: <View><SQL Server Objekt Explorer> einen neuen Eintrag, der Ihnen das geöffnete Datenbankprojekt so darstellt, wie es später auch im SQL Server dargestellt wird:

Vorher Nachher
WithOutExtension_thumb1 WithExtension_thumb1

Außerdem können Sie mit den SQL Server Power Tools Objekte editieren, anlegen, löschen, umbenennen und in ein anderes Schema verschieben.

Share |

SharePoint 2010 Deployment (Teil 1) – Erstellen einer SiteCollection 13.04.2012

Thomas Nissen
Thomas Nissen, BI eXpert

Bei SharePoint 2010 Deployment handelt sich um eine Serie von Blogbeiträgen, die die verschiedenen Schritte für das Deployment von SiteCollection erläutert und ausführt. Dabei wird der Fokus auf das Einspielen einer Backup-Datei aus der Entwicklungsumgebung auf die Test- oder Produktivumgebung gelegt.

 

In diesem, sowie in den folgenden Beiträgen zu diesem Thema, werden die folgenden Punkte für das Deployment von SharePoint 2010 Seiten näher erläutert:

  1. Erstellen einer SiteCollection
  2. Wiederherstellen einer Backup-Datei
  3. Erstellen von SecureStore-Applikationen
  4. Importieren von Business Data Connectivity Models
  5. Deployen von SQL Server Reporting Services Reports

Im ersten Teil dieser Blogserie behandeln wir das Erstellen einer SiteCollection in SharePoint 2010 mit Hilfe von Powershell. Hierfür nutzen wir eine konfigurierbare Powershell-Datei, welche nach Belieben angepasst werden kann.

Für das Erstellen der Powershell-Datei sowie das nachträgliche Ausführen sind die folgenden Schritte notwendig:

  1. Erstellen einer Konfigurationsdatei
  2. Erstellen einer Powershell-Datei
  3. Einbinden der Konfigurationsdatei in die Powershell-Datei
  4. Ausführen

Konfigurationsdatei

Um ein unabhängiges Deployment zu erstellen, verwenden wir eine XML-Datei, die zur Konfiguration in dieser Blogserie verwendet wird.

Erstellen Sie hierfür eine neue Datei mit dem Namen Konfiguration.xml und fügen Sie den folgenden Teil in die Konfigurationsdatei.

   1: <?xml version="1.0" encoding="utf-8" ?>
   2: <Config_Content>
   3:   <!--Servername where the application will be installed/imported.-->
   4:   <Webapplication>http://<Servername></Webapplication>
   5:   
   6:   <!--Configuration for create and import SiteCollection-(Backup)-->
   7:   <!--Destination Url of the Site collection (Cannot be empty!!!)-->
   8:   <Url>/sites/mySite</Url>
   9:   <!--Title of the Site Collection (Cannot be empty!!!)-->
  10:   <Title>MySite</Title>
  11:   <!--Description of the Site Collection-->
  12:   <Description>This is a testpage for the blog.</Description>
  13:   <!--LanguageID are used for this Site Collection and their subsites (1033:English; 1031:German)-->
  14:   <LCID>1033</LCID>
  15:   <!--TemplateId from Microsoft (here: TeamSite Template)-->
  16:   <WebTemplate>STS#0</WebTemplate>
  17:   <!--Loginname of the Site Collection owner (Cannot be empty!!!)-->
  18:   <FirstOwnerLogin>Farm-Administrator</FirstOwnerLogin>
  19:   <!—Email address of the Site Collection owner (Cannot be empty!!!)-->
  20:   <FirstOwnerEmail>Thomas.Nissen@mySite.de</FirstOwnerEmail>
  21:   <!--Loginname of the Second Site Collection Administrator -->
  22:   <SecondaryOwnerLogin>Administrator</SecondaryOwnerLogin>
  23:   <!--Email address of the Second Site Collection Administrator -->
  24:   <SecondaryOwnerEmail>test.test@test.ag</SecondaryOwnerEmail>
  25: </Config_Content>

Eine Übersicht der Webtemplates können Sie mit dem Befehl

   1: Get-SPWebTemplate | Sort-Object „Name”

in der Microsoft SharePoint 2010 Management Shell abfragen.

Powershell-Datei

Im zweiten Schritt erstellen wir ein neues Powershell-Skript namens Deployment.ps1, welches die Konfigurationsdatei einliest und den Befehl zum Erstellen einer neuen SiteCollection ausführt.

Einbinden der Konfigurationsdatei

   1: #Read XML Configuration files
   2: [xml]$configurationElement = Get-Content "Konfiguration.xml"
   3: #----- Variables -----
   4: $SiteCollectionURL = $configurationElement.Config_Content.Url
   5: $Title = $configurationElement.Config_Content.Title
   6: $Description = $configurationElement.Config_Content.Description
   7: $LCID = $configurationElement.Config_Content.LCID
   8: $WebTemplate = $configurationElement.Config_Content.WebTemplate
   9: $FirstOwnerLogin = $configurationElement.Config_Content.FirstOwnerLogin
  10: $FirstOwnerEmail = $configurationElement.Config_Content.FirstOwnerEmail
  11: $SecondOwnerLogin = $configurationElement.Config_Content.SecondaryOwnerLogin
  12: $SecondOwnerEmail = $configurationElement.Config_Content.SecondaryOwnerEmail
  13: $Webapplication = $configurationElement.Config_Content.Webapplication
  14:  
  15: $newCollectionSite = $Webapplication + $SiteCollectionURL

In den kommenden zwei Schritten überprüfen wir vorab, ob eine SiteCollection mit dem Namen MySites schon unter /sites/mySite">/sites/mySite">/sites/mySite">/sites/mySite">/sites/mySite">/sites/mySite">/sites/mySite">http://<Servername>/sites/mySite existiert. Falls ja, soll diese gelöscht werden.

   1: #----- Delete the Site Collection if exist -----
   2: $CollectionSiteExist = Get-SPSite -Identity $newCollectionSite -EA 0
   3: if($CollectionSiteExist -ne $null)
   4: {
   5:   Remove-SPSite -Identity $newCollectionSite -Confirm:$False
   6: }

Anschließend erstellen wir unsere neue SiteCollection.

   1: #----- Create the Site Collection ----
   2: Write-Host "Create Site Collection Start"
   3: New-SPSite -URL $newCollectionSite -Name $Title -Description $Description -Language $LCID -Template $WebTemplate -OwnerAlias $FirstOwnerLogin -OwnerEmail $FirstOwnerEmail -SecondaryOwnerAlias $SecondOwnerLogin -SecondaryEmail $SecondOwnerEmail 
   4: Write-Host "Create Site Collection End"

Mit dem Befehl Write-Host können Sie eine Zeile im Shell-Fenster ausgeben (gleich dem echo-Befehl im CMD-Kommandofenster).

Ausführen

Öffnen Sie nun auf dem Server das Microsoft SharePoint 2010 Management Shell und navigieren zum dem Verzeichnis, in dem Sie die neu erstellten Dateien gespeichert haben.

Sie können das Skript auch mit dem von Windows Server mitgelieferten Powershell-Fenster ausführen. Hierzu müssen Sie jedoch noch die SharePoint spezifischen Methoden einbinden. Geben Sie dafür folgenden Befehl ein, bevor Sie das Deployment-Skript ausführen:

   1: Add-PsSnapin Microsoft.SharePoint.PowerShell

Um die SharePoint spezifischen Methoden auch dauerhaft im Windows Server mitgelieferten Powershell-Fenster nutzen zu können, finden Sie hier einen interessanten Blogeintrag von Kirk Evans.

Führen Sie das Powershell-Skript Deployment.ps1 aus. Anschließend sollte folgendes Fenster erscheinen:

image

Fazit

Zusammenfassend kann man sagen, dass sich mit Hilfe von Powershell in SharePoint 2010 einfach administrative und konfigurierbare Schritte ausführen lassen. Dieses bedeutet, insbesondere für Administratoren und Entwickler, eine erhebliche Zeitersparnis.

Im zweiten Teil dieser Blogserie SharePoint 2010 Deployment beschäftigen wir uns mit dem Thema Wiederherstellen einer Backup-Datei (erscheint in Kürze).

Hier finden Sie eine Übersicht aller Blogbeiträge zu dieser Blogserie.

Teil 1                    Teil 2                    Teil 3                     Teil 4                    Teil 5

Share |

SQL Server 2012: Sequences 11.04.2012

Frank Landgraf
Frank Landgraf, Senior BI eXpert

In diesem Artikel möchte ich das neue Feature “Sequences”, das bereits durch einen Kollegen im Artikel Neue T-SQL Funktionen im SQL Server 2012 (Teil 1/4) vorgestellt wurde, noch etwas ausführlicher erläutern.

Wie gehe ich mit Sequences um und was passiert “behind the scenes”?

 

 

Anlegen & Abfragen

-- Listing 1
CREATE SEQUENCE [dbo].[SeqCounter] AS INT-- Zulässig: Alle Integer-Datentypen (Std.: BIGINT)
START WITH 1                             -- Ohne START WITH wird beim Minimalwert begonnen
INCREMENT BY 1                           -- Hinweis: Inkremente können auch negativ sein
MINVALUE 1
MAXVALUE 10

Zusätzlich zum Abrufen per NEXT VALUE FOR hat man auch die Möglichkeit ganze Wertebereiche mit der Stored Procedure sp_sequence_get_range abzurufen. Hierzu möchte ich aber auf den entsprechenden MSDN-Artikel verweisen.

Sequences ändern

ALTER SEQUENCE [dbo].[SeqCounter]
RESTART WITH 10        -- nächsten Wert auf 10 einstellen
NO CYCLE               -- NO CYCLE = Bei Überschreitung von 10 wird eine Exception ausgelöst
                       -- CYCLE    = Bei Überschreitung von 10 wird vom MINVALUE neu
begonnen

Nach Ausführung des Kommandos

SELECT NEXT VALUE FOR [dbo].[SeqCounter]

erscheint wie erwartet der Wert 10, der mit RESTART WITH festgelegt wurde.
Wenn ich das Kommando erneut ausführe, wird durch die Option NO CYCLE folgende Exception ausgelöst:

Msg 11728, Level 16, State 1, Line 1
The sequence object ‘SeqCounter’ has reached its minimum or maximum value. Restart the sequence object to allow new values to be generated.

Hätten wir statt NO CYCLE die Option CYCLE verwendet, wäre das Ergebnis 1 ausgegeben worden.

Sequences löschen

Wenn wir die Sequence nicht mehr benötigen, kann sie mit dem DROP-Statement entfernt werden.

-- Löschen eines Sequence-Objekts
DROP SEQUENCE [dbo].[SeqCounter]

Welche Sequences gibt es?

Über den INFORMATION_SCHEMA-Katalog (INFORMATION_SCHEMA.SEQUENCES) oder über den Systemkatalog (SYS.SEQUENCES) lassen sich alle im aktuellen Datenbankkontext angelegten Sequences abfragen.

Alternativ hat das SQL Server-Team Sequences als neuen Knoten unter “Programmability” bzw. “Programmierbarkeit” einer Datenbank aufgenommen. Dort kann man div. Einstellungen mit Hilfe der GUI vornehmen.

Transaktionales Verhalten

Sequences wissen nichts von Transaktionen, d.h. wenn man ein ROLLBACK durchführt, sind die innerhalb des Transaktionsblocks abgerufenen Sequence-Werte “verbraucht”, sodass ohne separates Eingreifen eine Lücke in der sequentiellen Werte-Reihenfolge entsteht.

Caching

Die Caching-Option ist der größte Unterschied zu gewöhnlichen IDENTITY-Columns. Während bei Identitätsspalten per Default 20 Werte im Cache liegen (dieser Wert ist fest, differiert u.U. jedoch von Version zu Version), lässt sich das bei SEQUENCES nach individuellem Bedarf steuern. Standardmäßig wird ein Cache von 50 Werten verwendet, sofern weder die Option CACHE noch NO CACHE angegeben wird.

Mit Angabe der CACHE-Option hat man somit direkten Einfluss auf I/O-Vorgänge. Aber wie funktioniert das genau?

Hier ein kleines Beispiel (wir starten bei 10 und stellen den Cache auf 100 Werte ein)

ALTER SEQUENCE [dbo].[SeqCounter]
RESTART WITH 10
MINVALUE 10
MAXVALUE 1000000 CACHE 100

Wenn der erste Wert angefordert wird startet der SQL Server mit 10, vermerkt aber in der Systemtabelle sys.sequences den Wert 110 (aktueller Wert plus CACHE Einstellung) – er behauptet also, dass er bereits 100 Werte mehr vergeben hat. Sobald ein neuer Wert von der Sequence abgerufen wird, liefert der SQL Server diesen aus dem Zähler im Speicher, also 11, 12, …, bis 110. Damit ist die Grenze des gecachten Bereichs überschritten. Sobald der nächste Wert abgerufen wird wiederholt der SQL Server das Vorgehen: Er liefert zwar den nächsten Wert, schreibt aber wiederum den um 100 (basierend auf der CACHE-Einstellung) größeren Wert in die Systemtabelle.
Diese Vorgehensweise vermindert im Gegensatz zu Identities die Anzahl der Schreibzugriffe auf Metadaten und kann somit (insbesondere bei Massenverarbeitungsläufen) die Performance steigern.

Übrigens:

John Huang schreibt in seinem Blog, dass das Festlegen von großen CACHE-Werten kaum Performancevorteile bringt, da die wenigen Schreibvorgänge irgendwann nicht mehr wirklich ins Gewicht fallen.

Sollte der CACHE-Wert größer sein als MAXVALUE, wird der CACHE-Wert automatisch auf MAXVALUE reduziert.

Was passiert bei unerwartetem Herunterfahren der Datenbank-Engine?

Wenn die Datenbank-Engine per Service-Stop beendet wird, läuft alles “geregelt” ab, d.h. SQL Server schreibt dann den zuletzt vergebenen Wert (unabhängig der Cache-Einstellung) auf die Platte, sodass bei Neustart der nächste Wert vergeben werden kann und keine Sequence-Gap entsteht.

Im Desaster-Fall (Stromausfall oder “jemand deinstalliert SQL Server”…ok, dann ist sowieso alles weitere egal…aber man könnte schon von einem Desaster sprechen Winking smile) hat SQL Server u.U. keine Möglichkeit mehr diese Säuberungsarbeiten durchzuführen. D.h. im Klartext…die Werte gelten als “abgerufen”, sodass Lücken entstehen, die man aber auch manuell durch das RESTART WITH-Kommando “geradebiegen” könnte, sofern sinnvoll/gewünscht. Die Gefahr, dass Werte doppelt vergeben werden, besteht jedoch nicht.

Im Übrigen haben IDENTITIES hier einen Vorteil. Beim Hochfahren der Datenbank-Engine prüft SQL Server u.a. auch die zuletzt vergebenen Identitätswerte. Das stellt sicher, dass keine IDENTITY-Gaps durch technische Probleme entstehen können.

Security

Da es sich bei Sequences um “normale” Datenbankobjekte handelt, können hierauf auch Berechtigungen gesetzt werden. Dies kann man entweder über das eben erwähnte Dialogfeld oder klassisch über GRANT….TO… erledigen.

Einschränkungen

Sequences können nicht innerhalb von benutzerdefinierten Funktionen, Views, Unterabfragen, CTEs oder abgeleiteten Tabellen verwendet werden.

Ferner bekommt man Fehlermeldungen, sobald das verwendete Statement DISTINCT, EXCEPT, INTERSECT oder UNION verwendet. Eine Ausnahme davon bildet UNION ALL.

Es gibt noch eine Reihe weiterer Limitationen, die jedoch fast alle damit zu tun haben, dass sie nicht innerhalb von Aggregationen verwendet werden dürfen (z.B. PARTITION BY, GROUP BY…usw.).

Fazit

Sequences können bei richtiger Konfiguration performanter ablaufen und sind tabellenübergreifend einsetzbar. Sie lassen sich innerhalb einer Tabellendefinition als DEFAULT-Wert einbinden und können jederzeit modifiziert werden. Diese Vorzüge kombiniert mit höherer Kontrolle machen SEQUENCES zu einer sinnvollen Alternative, deren Einsatz jedoch hinsichtlich der vorhandenen Einschränkungen abgewogen werden muss.

Offizielle Dokumentation: http://msdn.microsoft.com/en-us/library/ff878058(v=sql.110).aspx

Share |

SQL Server 2012 ist verfügbar 04.04.2012

clip_image002

Sylvio Hellmann
Sylvio Hellmann, Chief eXpert

Nachdem Microsoft gemeinsam mit SQL PASS den SQL Server 2012 Ende Februar 2012 vorgestellt hat, steht er seit dem 2. April 2012 auch zum Kauf und Download bereit.

Wenn Sie mehr über die Möglichkeiten dieser Version des SQL Servers und den Business Intelligence Komponenten erfahren möchten, Unterstützung bei der Installation und Konfiguration benötigen oder Ihre Software an die neuen Funktionen anpassen möchten, können Sie sich jederzeit gerne an uns wenden.

Wenn Sie vorab bereits einige technische Informationen zu dieser Version des SQL Servers benötigen, können Sie von Microsoft Press ein kostenloses E-Book downloaden.

clip_image004

Introducing Microsoft SQL Server 2012

Autoren: Ross Mistry und Stacia Misner
Umfang: 288 Seiten

verfügbare Formate:
PDF
EPUB
MOBI

gedrucktes Buch (Preis $14,99)

Inhalt:

PART I DATABASE ADMINISTRATION (by Ross Mistry)
1. SQL Server 2012 Editions and Engine Enhancements
2. High-Availability and Disaster-Recovery Enhancements
3. Performance and Scalability
4. Security Enhancements
5. Programmability and Beyond-Relational Enhancements

PART II BUSINESS INTELLIGENCE DEVELOPMENT (by Stacia Misner)
6. Integration Services
7. Data Quality Services
8. Master Data Services
9. Analysis Services and PowerPivot
10. Reporting Services

Wenn Sie mehr über die geschichtliche Entwicklung des SQL Servers erfahren möchten, stellen wir Ihnen nachfolgend ein kurzes Video zur Verfügung.

Geschichte des SQL Servers
Share |

SDX Technical Council in MUC: SQL Server Systemanalyse und Best Practices

Simone Franz
Simone Franz, Marketing Manager

Herzlich lade ich Sie zum ersten Technical Council "SQL Server Systemanalyse und Best Practices von Microsoft und SDX" im Münchner SDX Büro ein.

Thema: ”SQL Server Systemanalyse und Best Practices von Microsoft und SDX”
Termin: Dienstag, den 24. April 2012, 17:00 im SDX Büro München
Zielgruppe: Projektleiter, techn. Projektleiter, Architekten, Datenbankadministratoren

17:00 Uhr: Begrüßungskaffee
17:30-19:30 Uhr: Übersicht SQL Server Lösungen
- Wie baue ich mir eine eigene Überwachung?
- Performance Dashboard
- Policy based Management
- Performance Data Warehouse
- SQL Utility
- System Center Advisor
- System Center Operations Manager
19:30 Uhr: Abendessen mit Bier und Wein

Der SQL Server bietet vielfältige Möglichkeiten zur Überwachung der Betriebsparameter. Auch wenn viele dieser Microsoft Komponenten kostenlos sind, ist es für Administratoren und Architekten schwer, die richtige Auswahl zu treffen.

Im TC „SQL Server Systemanalyse und Best Practices von Microsoft und SDX“ gibt Ihnen unser Chief eXpert Sylvio Hellmann einen Überblick über die verschiedenen Microsoft Komponenten. Er zeigt Ihnen, wie Sie diese in den IT-Betrieb einführen und auf welche SQL Server Betriebsparameter Sie speziell achten müssen.

tc_muenchen_sylvio_hellmann

Genießen Sie das abschließende Abendessen und unterhalten Sie sich in lockerer Atmosphäre mit den Teilnehmern und den SDX eXperts.

Das SDX Team freut sich über Ihr Kommen. Auf Wiedersehen im SDX Büro in der Landwehrstraße 61 (Munich Workstyle, Nähe Hauptbahnhof).

Herzliche Grüße
Simone Franz

Die komplette Einladung bzw. die Teilnahmebedingungen erhalten Sie >hier<.

Share |