Database
 sql >> Datenbank >  >> RDS >> Database

Ausführen von SQL-Datenbank-Wartungsaufgaben mit SQLCMD

In diesem Artikel geht es darum, ein fortgeschrittenes Verständnis des Dienstprogramms Sqlcmd zu entwickeln, mit dem Sie T-SQL-Befehle direkt von der Eingabeaufforderung aus ausführen können, ohne SSMS (SQL Server Management Studio) zu benötigen.

Der Artikel hebt auch die Bedeutung der Verwendung von Sqlcmd hervor, um einige fortgeschrittene Datenbankaufgaben auszuführen, die andernfalls zusätzliche Schritte erfordern würden, z. Herstellen einer Verbindung mit der Datenbank über ein vorinstalliertes Datenbanktool wie SSMS (SQL Server Management Studio) oder SSDT (SQL Server Data Tools), gefolgt von der Vorbereitung zum Ausführen von SQL-Skripts für die gewünschte(n) Datenbank(en).

Das Dienstprogramm Sqlcmd kann für Datenbankentwickler und DBAs eine große Zeitersparnis sein, da sie die erforderlichen SQL-Skripts direkt von der Befehlszeile aus ausführen können.

Überblick über SQLCMD-Grundlagen

Lassen Sie uns einige Grundlagen des Sqlcmd-Dienstprogramms durchgehen, falls Sie damit nicht vertraut sind.

Einfache Definition

Sqlcmd ist ein Befehlszeilentool, mit dem Sie T-SQL-Befehle direkt von der Eingabeaufforderung aus ausführen können.

Microsoft-Definition

Gemäß der Microsoft-Dokumentation ist das Sqlcmd-Dienstprogramm ein Befehlszeilen-Dienstprogramm für die interaktive Ad-hoc-Ausführung von Transact-SQL-Anweisungen und -Skripts und für die Automatisierung von Transact-SQL-Skriptaufgaben.

Grundlegende Verwendung von SQLCMD

Im Folgenden sind einige der grundlegenden Anwendungen von Sqlcmd aufgeführt, die in der Microsoft-Dokumentation behandelt werden:

  1. Sqlcmd kann T-SQL-Anweisungen ausführen (an der Eingabeaufforderung)
  2. Sqlcmd kann benutzerdefinierte oder Systemprozeduren (an der Eingabeaufforderung) ausführen
  3. Sqlcmd kann auch gespeicherte SQL-Skriptdateien ausführen (an der Eingabeaufforderung)
  4. Sqlcmd kann eine Verbindung zu mehreren SQL Server-Instanzen herstellen und Skripts ausführen
  5. Sqlcmd kann die Ausgabe von T-SQL-Anweisungen in eine Textdatei schreiben

Bitte lesen Sie meinen Artikel „Basics of Running T-SQL Statements from Command Line using SQLCMD“. ‘, die eine Anleitung zur Implementierung des Sqlcmd-Dienstprogramms ist, um einige der grundlegenden täglichen T-SQL-Aufgaben auszuführen.

Voraussetzungen

In diesem Artikel wird davon ausgegangen, dass Sie über grundlegendes Know-how zu Datenbankwartungsaufgaben verfügen, die über T-SQL-Anweisungen ausgeführt werden, sowie über grundlegende Kenntnisse des Dienstprogramms Sqlcmd.

Dieser Artikel geht außerdem davon aus, dass die Beispieldatenbank „Universität“ bereits auf Ihrer gewünschten SQL-Instanz erstellt wurde.

Mein Artikel „Basics of Running T-SQL Statements from Command Line using SQLCMD ‘ wird Ihnen dabei helfen, ein solides Verständnis der Sqlcmd-Grundlagen zu erlangen, bevor Sie zu den fortgeschritteneren Anwendungen übergehen.

Erweiterte Verwendung von SQLCMD

Abgesehen von den grundlegenden Anwendungen hat Sqlcmd die folgenden erweiterten Anwendungen:

  1. Sqlcmd kann Datenbankwartungsaufgaben ausführen
  2. Sqlcmd kann Datenbankaufgaben auf mehreren SQL-Instanzen ausführen
  3. Sqlcmd kann Datenbankwartungsaufgaben automatisieren
  4. Sqlcmd kann T-SQL-Skripte auf mehreren Instanzen automatisieren

Datenbankaufgabe 1:Erstellen eines schreibgeschützten Datenbankbenutzers

Werfen wir einen Blick auf eine sehr wichtige Datenbankaufgabe, nämlich das Erstellen eines Benutzers, der nur Lesezugriff auf eine Datenbank hat (wir nennen diesen Benutzer „ReadOnly“).

Anforderung:Hinzufügen eines ReadOnly-Benutzers zur Beispieldatenbank

Stellen Sie sich vor, ein DBA oder Datenbankentwickler wurde beauftragt, den ReadOnly-Benutzer zu einer zuvor erstellten Datenbank hinzuzufügen.

Sie werden diese Anforderung erfüllen, indem sie Sqlcmd verwenden.

Prinzip der geringsten Rechte und ReadOnly-Benutzer

Der Zweck der Erstellung des ReadOnly-Benutzers ist die Einhaltung der The Prinzip der geringsten Berechtigung , und gemäß der Microsoft-Dokumentation sollten Sie dieses Prinzip immer befolgen, wenn Sie Datenbankbenutzern Berechtigungen erteilen. Erteilen Sie einem Benutzer oder einer Rolle die Mindestberechtigungen, die zum Ausführen einer bestimmten Aufgabe erforderlich sind.

Daher müssen wir in den meisten Fällen einen Datenbankbenutzer so erstellen, dass die Berechtigungen dieses Benutzers darauf beschränkt sind, die Datenbankobjekte nur zu lesen, ohne sie ändern zu können.

Dies ist auch in Datenbankberichts- und Analyseszenarien sehr hilfreich, in denen ein Datenbankbenutzer, der auf die Daten zugreifen soll, nur Leserechte für die Informationen erhalten soll. Das Gewähren von mehr Rechten als erforderlich – wie z. B. Berechtigungen zum Hinzufügen oder Löschen von Objekten – kann in diesem Fall Sicherheitsrisiken darstellen.

Schritte zum Erstellen des ReadOnly-Datenbankbenutzers

Normalerweise wird ein neuer ReadOnly-Datenbankbenutzer wie folgt erstellt:

  1. Melden Sie sich mit ausreichenden Rechten bei SQL Server an, um einen neuen Datenbankbenutzer zu erstellen
  2. Wählen Sie die gewünschte Datenbank aus
  3. Neues Login mit Passwort in SQL Server erstellen
  4. Erstellen Sie einen neuen Benutzer für dieses Login
  5. Geben Sie diesem Benutzer Leseberechtigungen für die erforderliche Datenbank

Wir können diesen Prozess wie folgt veranschaulichen:

Beispieldatenbank bereits eingerichtet („Universität“)

Wie oben erwähnt, geht dieser Artikel davon aus, dass die Beispieldatenbank „Universität“ bereits erstellt wurde.

Bitte lesen Sie meinen vorherigen Artikel „Grundlagen zum Ausführen von T-SQL-Anweisungen von der Befehlszeile mit SQLCMD ‘, um eine Beispieldatenbank zu erstellen, oder verwenden Sie den folgenden T-SQL-Code, um eine Beispieldatenbank mit dem Namen „Universität“ einzurichten:

[expand title =”Code „]

-- (1) Create the ‘University’ sample database

CREATE DATABASE University;

GO


USE University


-- (2) Create Course table

IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES T WHERE T.TABLE_NAME='Course')

DROP TABLE dbo.Course

CREATE TABLE [dbo].[Course] (

[CourseId] INT IDENTITY (1, 1) NOT NULL,

[Name] VARCHAR (30) NOT NULL,

[Detail] VARCHAR (200) NULL,

CONSTRAINT [PK_Course] PRIMARY KEY CLUSTERED ([CourseId] ASC)

);


-- (3) Create Student table

IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES T WHERE T.TABLE_NAME='Student')

DROP TABLE dbo.Student

CREATE TABLE [dbo].[Student] (

[StudentId] INT IDENTITY (1, 1) NOT NULL,

[Name] VARCHAR (30) NULL,

[Course] VARCHAR (30) NULL,

[Marks] INT NULL,

[ExamDate] DATETIME2 (7) NULL,

CONSTRAINT [PK_Student] PRIMARY KEY CLUSTERED ([StudentId] ASC)

);


-- (4) Populate Course table

SET IDENTITY_INSERT [dbo].[Course] ON

INSERT INTO [dbo].[Course] ([CourseId], [Name], [Detail]) VALUES (1, N'DevOps for Databases', N'This is about DevOps for Databases')

INSERT INTO [dbo].[Course] ([CourseId], [Name], [Detail]) VALUES (2, N'Power BI Fundamentals', N'This is about Power BI Fundamentals')

INSERT INTO [dbo].[Course] ([CourseId], [Name], [Detail]) VALUES (3, N'T-SQL Programming', N'About T-SQL Programming')

INSERT INTO [dbo].[Course] ([CourseId], [Name], [Detail]) VALUES (4, N'Tabular Data Modeling', N'This is about Tabular Data Modeling')

INSERT INTO [dbo].[Course] ([CourseId], [Name], [Detail]) VALUES (5, N'Analysis Services Fundamentals', N'This is about Analysis Services Fundamentals')

SET IDENTITY_INSERT [dbo].[Course] OFF


-- (5) Populate Student table

SET IDENTITY_INSERT [dbo].[Student] ON

INSERT INTO [dbo].[Student] ([StudentId], [Name], [Course], [Marks], [ExamDate]) VALUES (1, N'Asif', N'Database Management System', 80, N'2016-01-01 00:00:00')

INSERT INTO [dbo].[Student] ([StudentId], [Name], [Course], [Marks], [ExamDate]) VALUES (2, N'Peter', N'Database Management System', 85, N'2016-01-01 00:00:00')

INSERT INTO [dbo].[Student] ([StudentId], [Name], [Course], [Marks], [ExamDate]) VALUES (3, N'Sam', N'Database Management System', 85, N'2016-01-01 00:00:00')

INSERT INTO [dbo].[Student] ([StudentId], [Name], [Course], [Marks], [ExamDate]) VALUES (4, N'Adil', N'Database Management System', 85, N'2016-01-01 00:00:00')

INSERT INTO [dbo].[Student] ([StudentId], [Name], [Course], [Marks], [ExamDate]) VALUES (5, N'Naveed', N'Database Management System', 90, N'2016-01-01 00:00:00')

SET IDENTITY_INSERT [dbo].[Student] OFF


GO

[/expandieren]

Mit Sqlcmd einen ReadOnly-Benutzer hinzufügen

Zunächst müssen Sie das Dienstprogramm Sqlcmd über das Fenster „Befehl ausführen“ aufrufen, nachdem Sie sichergestellt haben, dass Sie über ausreichende Rechte zum Erstellen eines Datenbankbenutzers verfügen.

Sqlcmd -S PC

Als Ergebnis der Ausführung dieses Befehls werden Sie mit der unbenannten Standard-SQL-Instanz verbunden – falls Sie eine haben. Andernfalls erwähnen Sie bitte \ um sich mit der gewünschten SQL-Instanz zu verbinden.

Sobald Sie mit der gewünschten SQL-Instanz verbunden sind, fügen Sie einen neuen Datenbankbenutzer mit Nur-Lese-Rechten namens „ReadOnly“ zur Datenbank „University“ hinzu, indem Sie den folgenden Code verwenden:

USE University

CREATE LOGIN ReadOnly with Password ='b1GS3crt00'

CREATE USER Readonly for login readonly

exec sp_addrolemember db_datareader,ReadOnly

GO

Überprüfen Sie den neu erstellten Datenbankbenutzer (ReadOnly)

Öffnen Sie SSMS (SQL Server Management Studio) und stellen Sie mit den folgenden Anmeldeinformationen eine Verbindung zur SQL Server-Datenbank-Engine her:

Benutzername:Nur lesen

Passwort:b1GS3crt00

Als Ergebnis werden Sie mit der SQL-Datenbank-Engine verbunden.

Wenn Sie mit der SQL-Datenbank-Engine verbunden sind, erweitern Sie den Knoten Datenbanken im Objekt-Explorer und klicken Sie auf die Universitätsdatenbank.

Wählen Sie als Nächstes Benutzer unter Sicherheit aus, um den Datenbankbenutzer „ReadOnly“ wie folgt anzuzeigen:

Datenbankaufgabe 2:Datenbank-ReadOnly-Benutzer mit SQLCMD löschen

Bei dieser Datenbankaufgabe geht es darum, einen Benutzer über das Sqlcmd-Dienstprogramm aus einer Datenbank zu löschen.

Anforderung:ReadOnly-Benutzer aus der Beispieldatenbank entfernen

Ziehen Sie eine neue Anforderung in Betracht – das Löschen eines Datenbankbenutzers mit Nur-Lese-Zugriff aus der Beispieldatenbank.

Schritte zum Löschen des ReadOnly-Datenbankbenutzers

Der allgemeine Prozess zum Löschen des neu erstellten ReadOnly-Benutzers zusammen mit seinem Login ist wie folgt:

  1. Melden Sie sich mit ausreichenden Rechten bei SQL Server an, um einen Datenbankbenutzer zu erstellen und zu löschen
  2. Wählen Sie die gewünschte Datenbank aus
  3. Entfernen Sie den ReadOnly-Benutzer aus der Rolle des Datenlesers
  4. Schreibgeschützten Benutzer aus der Datenbank löschen
  5. Schreibgeschützte Anmeldung von SQL Server löschen

Sqlcmd verwenden, um ReadOnly-Benutzer (mit Anmeldung) zu löschen

Bitte stellen Sie sicher, dass alle anderen Verbindungen zur Datenbank „Universität“ über den ReadOnly-Benutzer geschlossen sind.

Stellen Sie mit Sqlcmd eine Verbindung zur SQL-Instanz her und führen Sie den folgenden Code an der Eingabeaufforderung aus, um alle aktuellen Sitzungen für die ReadOnly-Anmeldung zu schließen (wenn eine Verbindung mit der SQL-Instanz besteht, die zuvor zum Erstellen des ReadOnly-Benutzers verwendet wurde)

SELECT session_id FROM sys.dm_exec_sessions where login_name='ReadOnly'

GO

Sie müssen prüfen, welche Sitzungs-ID zurückgegeben wird, und die Verbindung basierend auf dieser Sitzungs-ID beenden:

KILL 55

GO

Bitte beachten Sie, dass hier als Beispiel „55“ verwendet wird. Sie müssen jede session_id löschen, die Sie auf Ihrem Computer erhalten, wenn Sie mit der gewünschten SQL-Instanz verbunden sind.

Führen Sie als Nächstes den folgenden Code aus, um den Datenbankbenutzer und die Anmeldung zu löschen:

Use University

EXEC sp_droprolemember 'db_datareader', 'ReadOnly'

EXEC sp_dropuser ReadOnly

EXEC sp_droplogin ReadOnly

GO

Als Ergebnis sollte der Datenbankbenutzer ReadOnly erfolgreich gelöscht werden.

Überprüfen Sie den gelöschten Benutzer (ReadOnly)

Versuchen Sie, mit den folgenden Anmeldeinformationen eine Verbindung zu SQL Server herzustellen:

Benutzername:ReadOnly

Passwort:b1GS3crt00

Der fehlgeschlagene Verbindungsversuch, der aus dem Versuch resultiert, eine Verbindung zu SQL Server mit ReadOnly-Anmeldung herzustellen, beweist, dass diese Anmeldung und dieser Datenbankbenutzer erfolgreich entfernt wurden.

Auf diese Weise haben wir mithilfe von Sqlcmd einen Datenbankbenutzer mit Nur-Lese-Zugriff entfernt, indem wir einfach Code an der Eingabeaufforderung ausgeführt haben, ohne SSMS (SQL Server Management Studio) verwenden zu müssen.

Datenbankaufgabe 3:Erstellen eines Datenbankbenutzers mit Nur-Lese-Zugriff in mehreren SQL-Instanzen

Lassen Sie uns die Vorteile der Verwendung einer SQL-Skriptdatei untersuchen, die über das Dienstprogramm Sqlcmd aufgerufen wird, um einen Datenbankbenutzer mit schreibgeschütztem Zugriff auf mehrere SQL-Instanzen für die Beispieldatenbank hinzuzufügen.

Anforderung:Fügen Sie ReadOnly-Benutzer für mehrere Instanzen für die Beispieldatenbank hinzu

Als Datenbankentwickler oder DBA haben Sie die Aufgabe, einen Datenbankbenutzer mit Lesezugriff auf die Beispieldatenbank für mehrere SQL-Instanzen über ein Skript mit Sqlcmd hinzuzufügen.

Voraussetzungen

Diese Aufgabe setzt voraus, dass auf Ihrem Computer mindestens zwei SQL-Instanzen installiert sind und beide über die Beispieldatenbank „University“ verfügen, während für beide Datenbanken ein Datenbank-Benutzername ReadOnly (mit Nur-Lese-Zugriff) erstellt werden muss.

Erstellen einer Beispieldatenbank auf einer anderen SQL-Instanz

Bitte überspringen Sie diesen Schritt, wenn Sie die Beispieldatenbank „Universität“ bereits auf einer zweiten SQL-Instanz erstellt haben.

Lassen Sie uns zunächst eine Verbindung zu einer anderen SQL-Instanz herstellen, indem Sie den folgenden Code im Fenster „Befehl ausführen“ ausführen:

sqlcmd –S <computername>\<sqlinstancename>

Sobald Sie mit der gewünschten SQL-Instanz verbunden sind, verwenden Sie bitte den Code vom Anfang des Artikels, um die „University“-Datenbank zu erstellen (oder lesen Sie meinen Artikel „Basics of Running T-SQL Statements from Command Line“. mit SQLCMD ‘).

Erstellen Sie eine Skriptdatei, um einen ReadOnly-Datenbankbenutzer hinzuzufügen

Kopieren Sie das folgende Skript und speichern Sie es im Editor unter AddReadOnyUniversityDatabaseUser.sql Datei in C:\SQLScripts Ordner zu Testzwecken.

-- This script creates a database user named ReadOnly with read-only access for the University database

USE University

CREATE LOGIN ReadOnly with Password ='b1GS3crt00'

CREATE USER Readonly for login readonly

exec sp_addrolemember db_datareader,ReadOnly

Verbinden Sie sich mit der ersten SQL-Instanz und führen Sie das Skript über Sqlcmd aus

Öffnen Sie die Eingabeaufforderung, indem Sie „cmd eingeben ‘ im Suchfeld. Führen Sie dann die folgende Zeile aus:

Sqlcmd –S . –i c:\SQLScripts\AddReadOnyUniversityDatabaseUser.sql

Woher "." (Punkt) kennzeichnet eine unbenannte Standard-SQL-Instanz, die durch eine bestimmte SQL-Instanz Ihrer Wahl ersetzt werden kann.

Verbinden Sie sich mit der zweiten SQL-Instanz und führen Sie das Skript über Sqlcmd aus

Öffnen Sie als Nächstes die Befehlszeile und verwenden Sie den folgenden Code, um das SQL-Skript auszuführen, das einen Datenbankbenutzer auf einer anderen SQL-Instanz erstellt:

Sqlcmd –S .\SQLTAB –i c:\SQLScripts\AddReadOnyUniversityDatabaseUser.sql

Bitte beachten Sie, dass „SQLTAB“ durch den Namen einer auf Ihrem Computer installierten SQL-Instanz ersetzt werden sollte.

Herzliche Glückwünsche! Sie haben erfolgreich einen Datenbankbenutzer mit Nur-Lese-Zugriff für die Beispieldatenbank auf mehreren SQL-Instanzen erstellt, indem Sie einfach eine Skriptdatei mit dem Dienstprogramm Sqlcmd ausgeführt haben.

Wir haben gelernt, verschiedene Datenbankaufgaben zu vereinfachen, indem wir Sqlcmd sowohl im direkten Modus (Eingabe von T-SQL-Code, sobald eine Verbindung mit einer gewünschten SQL-Instanz hergestellt wurde) als auch im indirekten Modus (wenn Sqlcmd ein Skript für eine Datenbank auf einer gewünschten SQL-Instanz über die Befehlszeile ausführt) verwenden ).

Dinge zu tun

Jetzt, da Sie bereit sind, Datenbankaufgaben wie das Hinzufügen eines Datenbankbenutzers mit Nur-Lese-Berechtigungen mit dem Dienstprogramm sqlcmd auszuführen, können Sie Ihre Fähigkeiten weiter verbessern, indem Sie die folgenden Dinge ausprobieren:

  1. Versuchen Sie, einen Datenbankbenutzer mit Nur-Lese-Zugriff für die in meinem Artikel erwähnte Beispieldatenbank SQLBookShop zu erstellen, mit Ausnahme der gespeicherten Prozeduren, die nach der Beschreibung der Verwendung des Dienstprogramms sqlcmd erwähnt werden.
  2. Versuchen Sie, eine Datenbank und einen Datenbankbenutzer mit Nur-Lese-Zugriff über eine Skriptdatei zu erstellen, die über das sqlcmd-Dienstprogramm für die SQLBookShop-Datenbank ausgeführt wird, einschließlich einer der in meinem Artikel erwähnten gespeicherten Prozeduren.
  3. Erstellen Sie eine Skriptdatei und testen Sie sie mit dem Dienstprogramm Sqlcmd, um einen zuvor hinzugefügten schreibgeschützten Benutzer aus der Beispieldatenbank University auf mehreren SQL-Instanzen zu entfernen.

Nützliches Tool:

dbForge Studio für SQL Server – leistungsstarke IDE für die Verwaltung, Verwaltung, Entwicklung, Datenberichterstattung und -analyse von SQL Server.