Erstellen Sie ein Backup Ihrer Datenbank mit einem Klick. Für welchen Zweck
kann eine solche Technik genutzt werden?
Sie betreiben bsp. einen Web-Server mit Datenbank-Anbindung, wobei Sie den MS-SqlServer oder die
Microsoft Data Engine verwenden. Aus Gründen der Sicherheit Ihres Systems wird der Datenbank-Zugriff
von der ASP- oder ASPX-Seite nur über einen Nutzer abgewickelt, der ein sehr schwaches Zugriffs-Recht hat.
Dieser Nutzer darf bsp. nur auf eine einzige Datenbank zugreifen, er hat keine direkten SELECT, INSERT-,
UPDATE- oder DELETE-Rechte. Er gehört weder zu einer Server- noch zu einer Datenbank-Rolle. Er darf
lediglich gewisse gespeicherte Prozeduren ausführen, denen er viele Parameter übergibt. Sie vermeiden
damit Gefahren, die von einer möglichen Sql-Injection kommen könnten.
Nun benötigen Sie über diesen Datenbank-Zugriff die Möglichkeit, eine Aktion auszuführen, für
die ein stärkeres Recht notwendig ist. Denken Sie an das Sichern der Datenbank außerhalb des
üblichen Zeitplans, das Erstellen oder Ändern einer Datenbank, das Erstellen / Ändern / Löschen einer
Tabelle oder ihrer Spalten. Oder Sie müssen auf eine kanonische Art und Weise zu einer neuen Tabelle
die gespeicherte Prozedur erstellen, die Ihr eigenes Sicherheitskonzept
implementiert.
Dieselbe Anforderung kann sich ebenso in einem lokalen Netzwerk stellen. Ein Nutzer soll
das Recht bekommen, die Durchführung einer Datenbank-Sicherung veranlassen zu können, ohne daß er
ein erweitertes Recht erhält oder gar selbst einen Sql-Befehl ausführen müßte. Dies ist
nicht nur im Sinne eines Zugriffsschutzes, sondern auch im Sinne einer möglichst geringen
Fehleranfälligkeit wünschenswert, es kann auch relevant für Ihre Urlaubsvertretung sein.
Notwendige Schritte
Mit der folgenden Technik können Sie für dieses Szenario eine Lösung implementieren.
Einmalig sind die folgenden Schritte zu erledigen
Erstellen Sie die gespeicherte Prozedur, welche Ihrer Anforderung entspricht.
Zur Ausführung der dort definierten Aktionen ist das SysAdmin-Recht notwendig.
Erstellen Sie einen Job, dessen einzigster Job-Step diese gespeicherte Prozedur aufruft
(sp_add_job in der msdb-Datenbank).
Erstellen Sie eine benutzerdefinierte Message mit einer eigenen Nummer (sp_addmessage
in der master).
Verknüpfen Sie die Nummer der selbstdefinierten Message mit dem Namen des Jobs,
indem Sie eine Warnung erstellen (sp_add_alert in msdb)
Schließlich erstellen Sie eine gespeicherte Prozedur, die nur einmalig
RaisError aufruft. Für diese Prozedur erhält der Nutzer, der diese Aktion ausführen soll,
die Execute-Berechtigung.
Beispiel
Kopieren Sie sich das folgende Script in eine Datei namens Scriptdatei.sql
-- Wechseln Sie in die Datenbank, in der die gespeicherte Prozedur
-- erstellt werden soll
use db_production
go
-- Erstellen Sie diese - für die Ausführung des Backup-Befehls
-- ist das sysadmin-, db_owner- oder db_backupoperator-Recht notwendig
Create Procedure up_backup_Database
As
Backup Database db_production
To Disk = 'E:\MSSQL\Backup\db_production.bak'
go
-- Wechsel in die msdb
use msdb
go
-- Erzeugen des Jobs
Execute sp_add_job @job_name = 'job_backup_db_production',
@notify_level_eventlog = 3
Execute sp_add_jobstep @job_name = 'job_backup_db_production',
@step_name = 'jobstep_backup_db_production',
@step_id = 1,
@subsystem = 'TSQL',
@command = 'Execute db_production.dbo.up_backup_Database',
@database_name = 'master',
@cmdexec_success_code = 0,
@on_success_action = 1,
@output_file_name =
'E:\MSSQL\own_logs\job_backup_db_production.txt',
-- Dies schreibt Ausgaben in die angegebene Datei
@flags = 2
-- Anhängen anstatt überschreiben
Execute sp_add_jobserver @job_name = 'job_backup_db_production'
go
-- Erstellen der eigenen Message
Execute master.dbo.sp_addmessage @msgnum = 100101,
-- Dies ist Ihr eigener Nummernkreis
@severity = 1,
@msgtext = 'Backup Database db_production',
@lang = 'us_english',
@with_log = 'true',
-- with_log ist entscheidend: Jeder Aufruf wird
-- ins EventLog eingetragen
@replace = 'replace'
-- Erstellen der lokalisierten Version
Execute master.dbo.sp_addmessage @msgnum = 100101,
@severity = 1,
@msgtext = 'Datenbank db_production sichern',
@lang = 'german',
@with_log = 'true',
@replace = 'replace'
-- Erstellen der Warnung
Execute sp_add_alert @name = 'alert_backup_db_production',
@message_id = 100101,
@include_event_description_in = 7,
-- Dies kann nützlich sein, falls Sie RaisError weitere
-- Informationen mitgeben möchten
@database_name = 'db_production',
-- In dieser Datenbank muß RaisError ausgelöst werden,
-- um diesen Alert zu aktivieren
@job_name = 'job_backup_db_production'
go
-- Erstellen der eigentlichen Prozedur
-- und Erteilen der Execute-Berechtigung
use db_production
go
Create Procedure up_start_backup
As
RaisError(100101, 1, 1)
go
Grant Execute On up_start_backup To [INTERNETSERVER\AspNet]
-- Setzen Sie hier den zu dieser Aktion legitimierten Nutzer ein
go
Den Beispiel-Code verwenden
Erstellen Sie die Datenbank db_production einmalig per Hand:
OSQL -E -Q "Create Database db_production"
Führen Sie das Script über eine vertraute Anmeldung aus mit
OSQL -E -i Scriptdatei.sql
Starten Sie das Backup als der 'schwache Benutzer':
Nun werden Sie im Verzeichnis E:\MSSQL\Backup die Datei db_production.bak finden.
Eine genaue Protokollierung der normalerweise an die Konsole übergebenen Ausdrücke finden
Sie in der Datei 'E:\MSSQL\own_logs\job_backup_db_production.txt'.
Sie können sich auch eine Verknüpfung erstellen, welche die obige OSQL-Zeile als Befehl enthält.
Dann sichern Sie sich ihre Datenbank per Klick auf die Verknüpfung.
Link zur hiesigen Seite als QR-Code
Kontaktformular:
Schreiben Sie mir und wir bauen gemeinsam Ihre neue Web-Datenbank!
Mit dem Klick auf den Button stimmen Sie zu, daß Cookies in Ihrem Browser gespeichert werden. Informationen zu den gespeicherten Cookies finden Sie unter Datenschutz#Cookies.Bei Fragen zur Technik wenden Sie sich bitte an Server-Daten - Web-Datenbank-Lösungen