Archive for the ‘Allgemein’ Category

Guten Rutsch ins neue Jahr!


2009
12.31

An alle einen guten Rutsch ins neue Jahr!

Domainumzug erledigt


2009
12.22

Habe soeben den Umzug zu einem anderen Provider erledigt. Der Blog läuft und bis auf die Verzögerung der .Info-Nic, lief alles Problemlos.
Jetzt ab ins Bett :)

Defraggel fraggel fraggel


2009
06.18

Sodelle, heute ist es mal wieder soweit. Ich quäle mich durch unsere Datenbanken, und reorganisiere unsere Indizes. Aber lieber jetzt, als heute Nacht wenn ich Rufbereitschaft habe ;) und ich wegen eines Timeouts aus dem Bett geholt werde.

Zum glück verwenden wir von Idera den SQLDefrag Manager, das erspart mir das mühsame DBCC CHECKDB oder DBCC CHECKTABLE.

SQL Server Backup mit Idera SQLSafe Freeware Edition


2009
06.12

Heute will ich ein kostenloses Tool von Idera vorstellen. Leider ist das Backup von gerade sehr großen Datenbanken mit den Boardmitteln des SQL Servers oft eine sehr langwierige Angelegenheit (von den größenb der Backup File mal ganz zu schweigen).

Da kommt der SQLSafe von Idera ins Spiel, von dem es auch eine Freeware Edition gibt (im vergleich zur Vollversion kann man diesen nicht per Policies bzw. der Console steuern). Wer aber nur eine Hand voll Datenbanken sichern möchte, sollte sich den Safe einmal genauer ansehen.

Die größten Vorteile:

  • Komprimierung der Backups bis zu 95%
  • Schnellere Backups bis zu 50% Zeitersparnis im vergleich zu nativen Backups
  • Einfach zu Scripten

Nachdem Ihr den SQLSafe installiert habt, stehen euch zwei Möglichkeiten zum sichern der Datenbanken zur Verfügung. Zum einen über die Kommandozeile (SQLSafecmd) oder über die Stored Procedures (xp_ss_backup oder xp_ss_restore). Beispiele zu der Verwenung der Scripte findet ihr in den mitgelieferten Hilfefiles.

Als kleines Beispiel zum Sichern der Datenbanken via Kommandozeile:

SQL safecmd backup northwind c:\backup\northwind.safe
SQL safecmd backup northwind c:\backup\nw_%timestamp%.safe

Beispiel zum Sichern der Datenbanken über T-SQL:

DECLARE @Returncode int
EXEC @Returncode = [master].[dbo].[xp_ss_backup] @database = “Northwind”, @filename = "c:\backup\northwind.safe"

Hier gehts zu Idera.

Freitag! Wie nur die letzten Stunden rumbringen?


2009
06.05

Warzone Tower DefenseBald ist wieder eine Woche gesachafft. Meine Rufbereitschaft habe ich ohne einen Call durchgehalten (bis auf ein kleines LUN, welches ich gestern Abend noch vergrößern mußte).

Jetzt sind es noch wenige Stunden, bis das Wochende lacht. Bis dahin kann ich euch eins meiner lieblings Flash-Spiele ans Herz legen: Warzone Tower Defense! Aber natürlich nicht auf der Arbeit spielen!

Warzone Tower Defense.

YouTube XL


2009
06.04

Endlich kann ich auf meinem 1900×1280 15,4″ Notebook-Display in einer Augenfreundlichen Version mir die lustigen Videos von Youtube ansehen. YouTube XL ist für den Fernseher gedacht, um Videos auf der XBOX oder PS3 mit einer ansehnlichen und leicht zu steuernden Oberfläche anzuzeigen.

Wer es selbst einmal ausprobieren will, klickt am besten gleich hier: YouTube XL.

Project Natal: Microsoft macht den Menschen zum Controller


2009
06.03

Na wenn das mal keine schweißtreibende Angelegenheit wird ;)

Project Natal: Microsoft und die Revolution im Wohnzimmer – Golem.de.

SQL Server Logins synchronisieren


2009
06.03

Nachdem ich schon seit ein paar Wochen nichts geschrieben habe, wird es mal wieder Zeit.

Vor einigen Monaten haben wir auf der Arbeit unsere altes Cluster neu aufgesetzt, und den SQL Server auf neuer Hardware installiert. Nachdem wir massig SQL Logins und Windows Gruppen berechtigt hatten, stellte sich die Frage, wie wir diese Logins wieder auf den Datenbanken berechtigen können, ohne uns durch jede Datenbank zu klickern.

Um die Logins anzulegen hatte ich bereits ein Script zur Hand, jedoch mußten die neuen Logins (neue SID) mit den Datenbanken synchronisiert werden. Hier habe ich auf der SQLServerCenteral zwei kleine aber sehr gute Helferscripte gefunden, welche jedem DBA das Leben erleichtern.

Zunächst das erste Script, welches alle nicht synchronen Logins auf dem Server ausliest:

DECLARE @Collation varchar(100)
DECLARE @SQL VARCHAR(2000)

CREATE TABLE ##TempSync
(
DB_NME Varchar(50),
DBUserName varchar(50),
SysLoginName varchar(50)
)

SELECT @Collation = CONVERT(SYSNAME,DatabasePropertyEx('master','Collation'))

SET @SQL = 'USE [?]
SELECT ''?'' DB_NME,
       A.name DBUserName,
       B.loginname SysLoginName
 FROM sysusers A
      JOIN master.dbo.syslogins B
      ON A.name Collate ' + @Collation + ' = B.Name
      JOIN master.dbo.sysdatabases C
      ON C.Name = ''?''
 WHERE issqluser = 1
       AND (A.sid IS NOT NULL
       AND A.sid <> 0x0)
       AND suser_sname(A.sid) IS NULL
       AND (C.status & 32) =0 --loading
       AND (C.status & 64) =0 --pre recovery
       AND (C.status & 128) =0 --recovering
       AND (C.status & 256) =0 --not recovered
       AND (C.status & 512) =0 --offline
       AND (C.status & 1024) =0 --read only
 ORDER BY A.name'

INSERT into ##TempSync
EXEC sp_msforeachdb @SQL

SELECT * FROM ##TempSync

DROP TABLE ##TempSync

Und nun das Script, was alle Logins wieder synchronisiert

DECLARE @Collation VARCHAR (100)
DECLARE @SQL VARCHAR(2000)

SELECT @Collation =CONVERT(SYSNAME,DatabasePropertyEx('master','Collation'))

SET @SQL = 'USE [?]
DECLARE @DBUserName varchar(50)
DECLARE @SysLoginName varchar(50)
DECLARE SyncDBLogins CURSOR FOR
 SELECT A.name DBUserName,
        B.loginname SysLoginName
 FROM sysusers A
      JOIN master.dbo.syslogins B
      ON A.name Collate ' + @Collation + ' = B.Name
      JOIN master.dbo.sysdatabases C
      ON C.Name = ''?''
 WHERE issqluser = 1
       AND (A.sid IS NOT NULL
       AND A.sid <> 0x0)
       AND suser_sname(A.sid) IS NULL
       AND (C.status & 32) =0 --Loading
       AND (C.status & 64) =0 --pre recovery
       AND (C.status & 128) =0 --recovering
       AND (C.status & 256) =0 --not recovered
       AND (C.status & 512) =0 --offline
       AND (C.status & 1024) =0 --read only
 ORDER BY A.name

OPEN SyncDBLogins
FETCH NEXT FROM SyncDBLogins
 INTO @DBUserName, @SysLoginName

WHILE @@FETCH_STATUS = 0
 BEGIN
    EXEC sp_change_users_login ''update_one'', @DBUserName, @SysLoginName

    FETCH NEXT FROM SyncDBLogins
    INTO @DBUserName, @SysLoginName
 END
CLOSE SyncDBLogins
DEALLOCATE SyncDBLogins
'
EXEC sp_msforeachdb @SQL

Orginal Artikel: http://go.xinox.net/52sceq

Excel Arbeitsmappenschutz entfernenMA


2009
02.02

Hier ein kleines Stückchen VBA-Code, mit dessen Hilfe man eine Kennwort geschütze Arbeitsmappe “entsperren” kann.

Einfach mit Alt+F11 in den VBA-Editor wechseln, Code einfügen und ausführen.

Sub PasswordBreaker()
  'Author unknown but submitted by brettdj of www.experts-exchange.com
  'http://www.theofficeexperts.com/VBASamples/Excel02.htm

  Dim i As Integer, j As Integer, k As Integer
  Dim l As Integer, m As Integer, n As Integer
  Dim i1 As Integer, i2 As Integer, i3 As Integer
  Dim i4 As Integer, i5 As Integer, i6 As Integer
  On Error Resume Next
  For i = 65 To 66: For j = 65 To 66: For k = 65 To 66
  For l = 65 To 66: For m = 65 To 66: For i1 = 65 To 66
  For i2 = 65 To 66: For i3 = 65 To 66: For i4 = 65 To 66
  For i5 = 65 To 66: For i6 = 65 To 66: For n = 32 To 126

 ActiveSheet.Unprotect Chr(i) & Chr(j) & Chr(k) & _
      Chr(l) & Chr(m) & Chr(i1) & Chr(i2) & Chr(i3) & _
      Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
  If ActiveSheet.ProtectContents = False Then
      MsgBox "One usable password is " & Chr(i) & Chr(j) & _
          Chr(k) & Chr(l) & Chr(m) & Chr(i1) & Chr(i2) & _
          Chr(i3) & Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
   ActiveWorkbook.Sheets(1).Select
   Range("a1").FormulaR1C1 = Chr(i) & Chr(j) & _
          Chr(k) & Chr(l) & Chr(m) & Chr(i1) & Chr(i2) & _
          Chr(i3) & Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
       Exit Sub
  End If
  Next: Next: Next: Next: Next: Next
  Next: Next: Next: Next: Next: Next
End Sub

Ausgabe von sp_help_job in Temptable speichern


2009
01.15

Ich brauchte eine Übersicht von SQL Agent Jobs (Name, LastRunDate, Current Execution Status und LastRunOutcome), doch da die Job Hisorty auf 10 Tage auf diesem Server begrenzt ist, fällt der Ansatz über die Tabellen msdb.dbo.sysjobs und msdb.dbo.sysjobhistory aus (siehe Beispiel).

select distinct [name] as 'Job Name',
	case [enabled] when 1 then 'Enabled' else 'Disabled' end as 'Enabled',
	cast (ltrim(str(run_date))+' '+stuff(stuff(right('000000'+ltrim(str(run_time)), 6) , 3, 0, ':'), 6, 0, ':') as datetime) as 'Last Run',
	step_id as Step,
	case [h].[run_status]
		when 0 then 'Failed' else 'Success'
		end as 'Status'
from msdb.dbo.sysjobs         j
left join msdb.dbo.sysjobschedules s
	on j.job_id = s.job_id
LEFT join msdb.dbo.sysjobhistory h
	on j.job_id = h.job_id
where step_id = 0
     and h.instance_id in (select max(sh.instance_id)
				from msdb.dbo.sysjobs sj
				join msdb.dbo.sysjobhistory sh
					on sj.job_id = sh.job_id
				where h.step_id = 0
				group by sj.[name])

Die einzigste Möglichkeit von allen Jobs diese Werte zu ermitteln, ist über die Prozedur sp_help_job. Leider ist es nicht möglich das Ergebnis in eine TempTable umzuleiten (siehe Beispiel)

insert into #TempJobTable
   execute sp_help_job

Dies Endet dann meist in folgender Fehlermeldung:

Server: Msg 8164, Level 16, State 1, Procedure sp_get_composite_job_info, Line 67
An INSERT EXEC statement cannot be nested.

Nun bleibt nur noch der Weg über OPENROWSET (siehe Beispiel) was wunderbar funktioniert.

SELECT * INTO #JobInfo
FROM OPENROWSET('sqloledb', 'server=(local);trusted_connection=yes', 'set fmtonly off exec msdb.dbo.sp_help_job')
Select
[name],
cast(ltrim(str(last_run_date))+' '+stuff(stuff(right('000000'+ltrim(str(last_run_time)), 6) , 3, 0, ':'), 6, 0, ':') as NVARCHAR(255)) as 'Last Run',
CASE [current_execution_status]
	WHEN 1 THEN 'Executing'
	WHEN 2 THEN 'Waiting For Thread'
	WHEN 3 THEN 'Between Retries'
	WHEN 4 THEN 'Idle'
	WHEN 5 THEN 'Suspended'
	WHEN 7 THEN 'PerformingCompletion'
	ELSE 'Unknown'
	END AS Status
, CASE [last_run_outcome]
	WHEN 0 THEN 'Failed'
	WHEN 1 THEN 'Success'
	ELSE 'Unknown'
	END AS Result
from #JobInfo
ORDER BY [name]
DROP TABLE #JobInfo