Dit artikel gaat over het ontwikkelen van een geavanceerd begrip van het hulpprogramma Sqlcmd waarmee u T-SQL-opdrachten rechtstreeks vanaf de opdrachtprompt kunt uitvoeren zonder dat u SSMS (SQL Server Management Studio) nodig hebt.
Het artikel benadrukt ook het belang van het gebruik van Sqlcmd om een aantal databasetaken op geavanceerd niveau uit te voeren waarvoor anders extra stappen nodig zouden zijn, b.v. verbinding maken met de database via een vooraf geïnstalleerde databasetool zoals SSMS (SQL Server Management Studio) of SSDT (SQL Server Data Tools), gevolgd door het klaarmaken om SQL-scripts uit te voeren tegen de gewenste database(s).
Het hulpprogramma Sqlcmd kan enorm veel tijd besparen voor databaseontwikkelaars en DBA's, omdat ze de vereiste SQL-scripts rechtstreeks vanaf de opdrachtregel kunnen uitvoeren.
SQLCMD-basisoverzicht
Laten we enkele basisprincipes van het hulpprogramma Sqlcmd doornemen als u er niet bekend mee bent.
Eenvoudige definitie
Sqlcmd is een opdrachtregelprogramma waarmee u T-SQL-opdrachten rechtstreeks vanaf de opdrachtprompt kunt uitvoeren.
Microsoft-definitie
Volgens de Microsoft-documentatie is het hulpprogramma Sqlcmd een opdrachtregelprogramma voor ad-hoc, interactieve uitvoering van Transact-SQL-instructies en -scripts en voor het automatiseren van Transact-SQL-scripttaken.
Basisgebruik van SQLCMD
Hieronder volgen enkele basistoepassingen van Sqlcmd zoals beschreven in de Microsoft-documentatie:
- Sqlcmd kan T-SQL-statements uitvoeren (bij de opdrachtprompt)
- Sqlcmd kan door de gebruiker gedefinieerde of systeemprocedures uitvoeren (bij de opdrachtprompt)
- Sqlcmd kan ook opgeslagen SQL-scriptbestanden uitvoeren (bij de opdrachtprompt)
- Sqlcmd kan verbinding maken met meerdere SQL Server-instanties en scripts uitvoeren
- Sqlcmd kan de uitvoer van T-SQL-statements naar een tekstbestand schrijven
Raadpleeg mijn artikel 'Basisprincipes van het uitvoeren van T-SQL-statements vanaf de opdrachtregel met behulp van SQLCMD ', een handleiding voor het implementeren van het hulpprogramma Sqlcmd om enkele van de dagelijkse basistaken van T-SQL uit te voeren.
Vereisten
In dit artikel wordt ervan uitgegaan dat u over de basiskennis beschikt van databaseonderhoudstaken die worden uitgevoerd via T-SQL-instructies, evenals enige basiskennis van het hulpprogramma Sqlcmd.
Dit artikel gaat er ook van uit dat de voorbeelddatabase 'University' al is gemaakt op uw gewenste SQL-instantie.
Mijn artikel 'Basisprincipes van het uitvoeren van T-SQL-statements vanaf de opdrachtregel met behulp van SQLCMD ' zal je helpen een goed begrip te krijgen van de basisprincipes van Sqlcmd voordat je verdergaat met het meer geavanceerde gebruik ervan.
Geavanceerd gebruik van SQLCMD
Afgezien van het basisgebruik, heeft Sqlcmd de volgende geavanceerde toepassingen:
- Sqlcmd kan database-onderhoudstaken uitvoeren
- Sqlcmd kan databasetaken uitvoeren op meerdere SQL-instanties
- Sqlcmd kan onderhoudstaken voor databases automatiseren
- Sqlcmd kan T-SQL-scripts op meerdere instanties automatiseren
Databasetaak 1:Een alleen-lezen databasegebruiker maken
Laten we eens kijken naar een zeer belangrijke databasetaak, namelijk het maken van een gebruiker die alleen leestoegang heeft voor een database (we noemen deze gebruiker 'ReadOnly').
Vereiste:ReadOnly-gebruiker toevoegen aan de voorbeelddatabase
Stel je voor dat een DBA- of databaseontwikkelaar de taak heeft gekregen om de ReadOnly-gebruiker toe te voegen aan een eerder gemaakte database.
Ze gaan aan deze eis voldoen door Sqlcmd te gebruiken.
Beginsel van de minste rechten en alleen-lezen gebruiker
Het doel van het aanmaken van de ReadOnly-gebruiker is om te voldoen aan De Beginsel van het minste privilege , en volgens de Microsoft-documentatie moet u dit principe altijd volgen bij het verlenen van machtigingen aan databasegebruikers. Verleen de minimale machtigingen die nodig zijn voor een gebruiker of rol om een bepaalde taak te volbrengen.
Dus in de meeste gevallen moeten we een databasegebruiker zo maken dat de machtigingen van deze gebruiker beperkt zijn tot het alleen kunnen lezen van de databaseobjecten, zonder de mogelijkheid om ze te wijzigen.
Dit is ook erg handig in databaserapport- en analysescenario's, waarin een databasegebruiker die toegang gaat krijgen tot de gegevens alleen de rechten moet krijgen om de informatie te lezen. Het verlenen van meer rechten dan vereist, zoals machtigingen om objecten toe te voegen of te verwijderen, kan in dit geval beveiligingsrisico's opleveren.
Stappen om de ReadOnly-databasegebruiker te maken
Gewoonlijk wordt een nieuwe ReadOnly-databasegebruiker als volgt aangemaakt:
- Log in op SQL Server met voldoende rechten om een nieuwe databasegebruiker aan te maken
- Selecteer de gewenste database
- Maak een nieuwe login met wachtwoord in SQL Server
- Maak een nieuwe gebruiker voor die login
- Verleen alleen-lezen machtigingen aan die gebruiker voor de vereiste database
We kunnen dit proces als volgt illustreren:
Reeds voorbeelddatabase opgezet ('Universiteit')
Zoals hierboven vermeld, gaat dit artikel ervan uit dat de voorbeelddatabase 'University' al is gemaakt.
Raadpleeg mijn vorige artikel 'Basisprincipes van het uitvoeren van T-SQL-statements vanaf de opdrachtregel met behulp van SQLCMD ' om een voorbeelddatabase te maken of gebruik de volgende T-SQL-code om een voorbeelddatabase met de naam 'University' in te stellen:
[titel uitbreiden =”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
[/uitbreiden]
Sqlcmd gebruiken om ReadOnly-gebruiker toe te voegen
Allereerst moet u het hulpprogramma Sqlcmd aanroepen via het venster 'Opdracht uitvoeren' nadat u zeker weet dat u voldoende rechten heeft om een databasegebruiker aan te maken.
Sqlcmd -S PC
Als gevolg van het uitvoeren van deze opdracht, wordt u verbonden met de standaard naamloze SQL-instantie - als u die heeft. Vermeld anders
Zodra u bent verbonden met de gewenste SQL-instantie, voegt u een nieuwe databasegebruiker met alleen-lezenrechten genaamd 'ReadOnly' toe aan de 'University'-database met behulp van de volgende code:
USE University CREATE LOGIN ReadOnly with Password ='b1GS3crt00' CREATE USER Readonly for login readonly exec sp_addrolemember db_datareader,ReadOnly GO
Controleer de nieuw aangemaakte databasegebruiker (ReadOnly)
Open SSMS (SQL Server Management Studio) en maak verbinding met de SQL Server Database Engine met de volgende referenties:
Gebruikersnaam: Alleen-lezen
Wachtwoord:b1GS3crt00
Als gevolg hiervan wordt u verbonden met SQL Database Engine.
Wanneer u bent verbonden met de SQL Database Engine, vouwt u het knooppunt Databases uit in de Objectverkenner en klikt u op de Universitaire Database.
Kies vervolgens Gebruikers onder Beveiliging om de databasegebruiker ‘Alleen lezen’ als volgt te zien:
Databasetaak 2:Database ReadOnly-gebruiker verwijderen met SQLCMD
Deze databasetaak gaat over het verwijderen van een gebruiker uit een database via het hulpprogramma Sqlcmd.
Vereiste:verwijder ReadOnly-gebruiker uit de voorbeelddatabase
Overweeg een nieuwe vereiste – het verwijderen van een databasegebruiker met alleen-lezen toegang uit de voorbeelddatabase.
Stappen om ReadOnly-databasegebruiker te verwijderen
Het algemene proces van het verwijderen van de nieuw aangemaakte ReadOnly-gebruiker samen met zijn Login is als volgt:
- Log in op SQL Server met voldoende rechten om een databasegebruiker aan te maken en te verwijderen
- Selecteer de gewenste database
- Gebruiker Alleen-lezen verwijderen uit de rol Gegevenslezer
- Drop ReadOnly-gebruiker uit de database
- Alleen-lezen-aanmelding verwijderen van SQL Server
Sqlcmd gebruiken om ReadOnly-gebruiker te verwijderen (met login)
Zorg ervoor dat alle andere verbindingen met de 'University'-database via de ReadOnly-gebruiker zijn gesloten.
Maak verbinding met de SQL-instantie met behulp van Sqlcmd en voer de volgende code uit bij de opdrachtprompt om alle huidige sessies voor de ReadOnly-aanmelding te sluiten (indien verbonden met de SQL-instantie die eerder werd gebruikt om de ReadOnly-gebruiker te maken)
SELECT session_id FROM sys.dm_exec_sessions where login_name='ReadOnly' GO
U moet controleren welke session_id wordt geretourneerd en de verbinding verbreken op basis van die session_id:
KILL 55 GO
Houd er rekening mee dat '55' hier als voorbeeld wordt gebruikt. U moet de session_id die u op uw computer krijgt, laten vallen wanneer u bent verbonden met de gewenste SQL-instantie.
Voer vervolgens de volgende code uit om de databasegebruiker te verwijderen en in te loggen:
Use University EXEC sp_droprolemember 'db_datareader', 'ReadOnly' EXEC sp_dropuser ReadOnly EXEC sp_droplogin ReadOnly GO
Als gevolg hiervan zou de databasegebruiker ReadOnly succesvol moeten worden verwijderd.
Controleer de verwijderde gebruiker (alleen-lezen)
Probeer verbinding te maken met SQL Server met de volgende referenties:
Gebruikersnaam:Alleen-lezen
Wachtwoord:b1GS3crt00
De mislukte verbindingspoging die het gevolg is van een poging om verbinding te maken met SQL Server met behulp van ReadOnly login, bewijst dat deze login en databasegebruiker met succes zijn verwijderd.
Op deze manier hebben we met behulp van Sqlcmd een databasegebruiker met alleen-lezen toegang verwijderd door simpelweg wat code uit te voeren bij de opdrachtprompt zonder dat SSMS (SQL Server Management Studio) nodig is.
Databasetaak 3:Een databasegebruiker maken met alleen-lezen toegang in meerdere SQL-instanties
Laten we eens kijken naar de voordelen van het gebruik van een SQL-scriptbestand dat wordt aangeroepen via het hulpprogramma Sqlcmd om een databasegebruiker toe te voegen met alleen-lezen toegang tot meerdere SQL-instanties voor de voorbeelddatabase.
Vereiste:ReadOnly-gebruiker toevoegen voor meerdere instanties voor voorbeelddatabase
Als databaseontwikkelaar of DBA heb je de taak om een databasegebruiker met alleen-lezen toegang tot de voorbeelddatabase voor meerdere SQL-instanties toe te voegen via een script dat Sqlcmd gebruikt.
Voorwaarden
Deze taak gaat ervan uit dat er ten minste twee SQL-instanties op uw computer zijn geïnstalleerd en dat beide de voorbeelddatabase 'University' hebben, terwijl voor beide databases een database-gebruikersnaam ReadOnly (met alleen-lezen toegang) moet worden gemaakt.
Een voorbeelddatabase maken op een andere SQL-instantie
Sla deze stap over als u de voorbeelddatabase 'University' al op een tweede SQL-instantie hebt gemaakt.
Laten we eerst verbinding maken met een andere SQL-instantie door de volgende code uit te voeren in het venster Opdracht uitvoeren:
sqlcmd –S <computername>\<sqlinstancename>
Zodra u bent verbonden met de gewenste SQL-instantie, gebruikt u de code aan het begin van het artikel om de 'University'-database te maken (of raadpleeg mijn artikel 'Basisprincipes van het uitvoeren van T-SQL-statements vanaf de opdrachtregel' SQLCMD gebruiken ').
Maak een scriptbestand om ReadOnly-databasegebruiker toe te voegen
Kopieer het onderstaande script en sla het op in Kladblok als AddReadOnyUniversityDatabaseUser.sql bestand in C:\SQLScripts map voor testdoeleinden.
-- 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
Maak verbinding met de eerste SQL-instantie en voer het script uit via Sqlcmd
Open de opdrachtprompt door 'cmd . te typen ' in het zoekvak. Voer vervolgens de volgende regel uit:
Sqlcmd –S . –i c:\SQLScripts\AddReadOnyUniversityDatabaseUser.sql
Waar "." (punt) staat voor een standaard naamloze SQL-instantie die kan worden vervangen door een specifieke SQL-instantie naar keuze.
Verbind met de tweede SQL-instantie en voer het script uit via Sqlcmd
Open vervolgens de opdrachtregel en gebruik de volgende code om het SQL-script uit te voeren waarmee een databasegebruiker op een andere SQL-instantie wordt gemaakt:
Sqlcmd –S .\SQLTAB –i c:\SQLScripts\AddReadOnyUniversityDatabaseUser.sql
Houd er rekening mee dat 'SQLTAB' dit moet worden vervangen door de naam van een SQL-instantie die op uw computer is geïnstalleerd.
Gefeliciteerd! U hebt met succes een databasegebruiker gemaakt met alleen-lezentoegang voor de voorbeelddatabase op meerdere SQL-instanties door simpelweg een scriptbestand uit te voeren met het hulpprogramma Sqlcmd.
We hebben geleerd om verschillende databasetaken te vereenvoudigen door Sqlcmd te gebruiken in zowel directe modus (T-SQL-code typen zodra deze is verbonden met een gewenste SQL-instantie) en indirecte modus (wanneer Sqlcmd een script uitvoert tegen een database op een gewenste SQL-instantie vanaf de opdrachtregel ).
Dingen om te doen
Nu u klaar bent om databasetaken uit te voeren, zoals het toevoegen van een databasegebruiker met alleen-lezen-machtigingen met behulp van het hulpprogramma sqlcmd, kunt u uw vaardigheden verder verbeteren door de volgende dingen te proberen:
- Probeer een databasegebruiker aan te maken met alleen-lezen toegang voor de voorbeelddatabase SQLBookShop die in mijn artikel wordt genoemd, met uitzondering van de opgeslagen procedures die daarna worden genoemd, de beschrijving van het gebruik van het hulpprogramma sqlcmd.
- Probeer een database te maken en een databasegebruiker met alleen-lezen toegang via een scriptbestand dat wordt uitgevoerd via het hulpprogramma sqlcmd voor de SQLBookShop-database, inclusief een van de opgeslagen procedures die in mijn artikel worden genoemd.
- Maak een scriptbestand en voer het uit met het hulpprogramma Sqlcmd om een eerder toegevoegde alleen-lezen gebruiker te verwijderen uit de voorbeelddatabase University op meerdere SQL-instanties.
Handig hulpmiddel:
dbForge Studio voor SQL Server – krachtige IDE voor beheer, administratie, ontwikkeling, gegevensrapportage en analyse van SQL Server.