sql >> データベース >  >> RDS >> Database

SQLCMDを使用したSQLデータベース保守タスクの実行

    この記事では、SSMS(SQL Server Management Studio)を必要とせずにコマンドプロンプトから直接T-SQLコマンドを実行できるSqlcmdユーティリティの高度な理解を深めることについて説明します。

    この記事では、Sqlcmdを使用して、追加の手順が必要になる高度なレベルのデータベースタスクを実行することの重要性も強調しています。 SSMS(SQL Server Management Studio)やSSDT(SQL Server Data Tools)などのプレインストールされたデータベースツールを介してデータベースに接続し、目的のデータベースに対してSQLスクリプトを実行する準備をします。

    Sqlcmdユーティリティは、必要なSQLスクリプトをコマンドラインから直接実行できるため、データベース開発者やDBAにとって非常に時間の節約になります。

    SQLCMDの基本の概要

    Sqlcmdユーティリティに慣れていない場合は、その基本をいくつか見ていきましょう。

    簡単な定義

    Sqlcmdは、コマンドプロンプトから直接T-SQLコマンドを実行できるコマンドラインツールです。

    Microsoftの定義

    Microsoftのドキュメントによると、Sqlcmdユーティリティは、Transact-SQLステートメントとスクリプトをアドホックでインタラクティブに実行し、Transact-SQLスクリプトタスクを自動化するためのコマンドラインユーティリティです。

    SQLCMDの基本的な使用法

    以下は、Microsoftのドキュメントで説明されているSqlcmdの基本的な使用法の一部です。

    1. Sqlcmdは(コマンドプロンプトで)T-SQLステートメントを実行できます
    2. Sqlcmdは、ユーザー定義またはシステムプロシージャを(コマンドプロンプトで)実行できます
    3. Sqlcmdは、保存されたSQLスクリプトファイルを(コマンドプロンプトで)実行することもできます
    4. Sqlcmdは複数のSQLServerインスタンスに接続し、スクリプトを実行できます
    5. SqlcmdはT-SQLステートメントの出力をテキストファイルに書き込むことができます

    私の記事「SQLCMDを使用してコマンドラインからT-SQLステートメントを実行するための基本」を参照してください。 ‘。これは、基本的な日常のT-SQLタスクの一部を実行するためのSqlcmdユーティリティの実装に関するガイドです。

    前提条件

    この記事は、T-SQLステートメントを介して実行されるデータベースメンテナンスタスクの基本的なノウハウと、Sqlcmdユーティリティの基本的な知識があることを前提としています。

    この記事では、サンプルデータベース「University」が目的のSQLインスタンスですでに作成されていることも前提としています。

    私の記事「SQLCMDを使用してコマンドラインからT-SQLステートメントを実行するための基本 ‘は、より高度な使用法に進む前に、Sqlcmdの基本をしっかりと理解するのに役立ちます。

    SQLCMDの高度な使用法

    基本的な用途とは別に、Sqlcmdには次の高度な用途があります。

    1. Sqlcmdはデータベースのメンテナンスタスクを実行できます
    2. Sqlcmdは複数のSQLインスタンスでデータベースタスクを実行できます
    3. Sqlcmdはデータベースのメンテナンスタスクを自動化できます
    4. Sqlcmdは、複数のインスタンスでT-SQLスクリプトを自動化できます

    データベースタスク1:読み取り専用データベースユーザーの作成

    データベースへの読み取り専用アクセスのみを持つユーザーを作成するという非常に重要なデータベースタスクを見てみましょう(このユーザーを「読み取り専用」と呼びます)。

    要件:サンプルデータベースにReadOnlyユーザーを追加する

    DBAまたはデータベース開発者が、以前に作成したデータベースにReadOnlyユーザーを追加するように依頼されたと想像してください。

    Sqlcmdを使用して、この要件を満たします。

    最小特権と読み取り専用ユーザーの原則

    ReadOnlyユーザーを作成する目的は、に準拠することです。 最小特権の原則 、およびMicrosoftのドキュメントによると、データベースユーザーにアクセス許可を付与するときは、常にこの原則に従う必要があります。ユーザーまたはロールが特定のタスクを実行するために必要な最小限の権限を付与します。

    そのため、ほとんどの場合、データベースユーザーを作成する必要があります。この方法では、このユーザーの権限がデータベースオブジェクトの読み取りのみに制限され、変更することはできません。

    これは、データベースレポートおよび分析シナリオでも非常に役立ちます。このシナリオでは、データにアクセスするデータベースユーザーに、情報を読み取る権限のみを付与する必要があります。この場合、オブジェクトを追加または削除する権限など、必要以上の権限を付与すると、セキュリティリスクが発生する可能性があります。

    読み取り専用データベースユーザーを作成する手順

    通常、新しい読み取り専用データベースユーザーは次のように作成されます。

    1. 新しいデータベースユーザーを作成するための十分な権限を持ってSQLServerにログインします
    2. 目的のデータベースを選択します
    3. SQLServerでパスワードを使用して新しいログインを作成する
    4. そのログイン用の新しいユーザーを作成する
    5. 必要なデータベースに対してそのユーザーに読み取り専用のアクセス許可を付与する

    このプロセスは次のように説明できます。

    すでにサンプルデータベース(「大学」)を設定しています

    前述のように、この記事では、サンプルデータベース「University」がすでに作成されていることを前提としています。

    以前の記事「SQLCMDを使用してコマンドラインからT-SQLステートメントを実行するための基本」を参照してください。 ‘サンプルデータベースを作成するか、次のT-SQLコードを使用して、‘University’と呼ばれるサンプルデータベースをセットアップします。

    [expand title =”コード 「]

    -- (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

    [/エキスパンド]

    Sqlcmdを使用して読み取り専用ユーザーを追加する

    まず、データベースユーザーを作成するための十分な権限があることを確認した後、[コマンドの実行]ウィンドウからSqlcmdユーティリティを呼び出す必要があります。

    Sqlcmd -S PC

    このコマンドを実行した結果、デフォルトの名前のないSQLインスタンス(存在する場合)に接続されます。それ以外の場合は、 \ に言及してください 目的のSQLインスタンスに接続します。

    目的のSQLインスタンスに接続したら、次のコードを使用して、「ReadOnly」という読み取り専用権限を持つ新しいデータベースユーザーを「University」データベースに追加します。

    USE University
    
    CREATE LOGIN ReadOnly with Password ='b1GS3crt00'
    
    CREATE USER Readonly for login readonly
    
    exec sp_addrolemember db_datareader,ReadOnly
    
    GO

    新しく作成されたデータベースユーザーを確認します(読み取り専用)

    SSMS(SQL Server Management Studio)を開き、次の資格情報を使用してSQLServerデータベースエンジンに接続します。

    ユーザー名:読み取り専用

    パスワード: b1GS3crt00

    その結果、SQLデータベースエンジンに接続されます。

    SQLデータベースエンジンに接続したら、オブジェクトエクスプローラーで[データベース]ノードを展開し、[大学のデータベース]をクリックします。

    次に、[セキュリティ]で[ユーザー]を選択して、次のように「読み取り専用」データベースユーザーを表示します。

    データベースタスク2:SQLCMDを使用したデータベース読み取り専用ユーザーの削除

    このデータベースタスクは、Sqlcmdユーティリティを介してデータベースからユーザーを削除することです。

    要件:サンプルデータベースからReadOnlyユーザーを削除する

    新しい要件を検討してください–サンプルデータベースから読み取り専用アクセス権を持つデータベースユーザーを削除します。

    読み取り専用データベースユーザーを削除する手順

    新しく作成されたReadOnlyユーザーとそのログインを削除する一般的なプロセスは次のとおりです。

    1. データベースユーザーを作成および削除するための十分な権限を使用してSQLServerにログインします
    2. 目的のデータベースを選択します
    3. データリーダーの役割からReadOnlyユーザーを削除します
    4. データベースからReadOnlyユーザーを削除します
    5. SQLServerから読み取り専用ログインを削除する

    Sqlcmdを使用して読み取り専用ユーザーを削除する(ログインあり)

    ReadOnlyユーザーを介した「University」データベースへの他のすべての接続が閉じられていることを確認してください。

    Sqlcmdを使用してSQLインスタンスに接続し、コマンドプロンプトで次のコードを実行して、ReadOnlyログインの現在のすべてのセッションを閉じます(以前にReadOnlyユーザーの作成に使用されたSQLインスタンスに接続されている場合)

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

    どのsession_idが返されるかを確認し、そのsession_idに基づいて接続を切断する必要があります:

    KILL 55
    
    GO

    ここでは例として「55」が使用されていることに注意してください。目的のSQLインスタンスに接続するときに、マシンで取得しているsession_idをすべて削除する必要があります。

    次に、次のコードを実行してデータベースユーザーを削除し、ログインします。

    Use University
    
    EXEC sp_droprolemember 'db_datareader', 'ReadOnly'
    
    EXEC sp_dropuser ReadOnly
    
    EXEC sp_droplogin ReadOnly
    
    GO
    を使用します

    その結果、データベースユーザーのReadOnlyは正常に削除されます。

    ドロップされたユーザーを確認します(読み取り専用)

    次の資格情報を使用してSQLServerに接続してみてください。

    ユーザー名:読み取り専用

    パスワード: b1GS3crt00

    読み取り専用ログインを使用してSQLServerに接続しようとしたために失敗した接続試行は、このログインとデータベースユーザーが正常に削除されたことを証明します。

    このように、Sqlcmdを使用して、SSMS(SQL Server Management Studio)を使用せずに、コマンドプロンプトでコードを実行するだけで、読み取り専用アクセス権を持つデータベースユーザーを削除しました。

    データベースタスク3:複数のSQLインスタンスで読み取り専用アクセス権を持つデータベースユーザーを作成する

    Sqlcmdユーティリティを介して呼び出されるSQLスクリプトファイルを使用して、サンプルデータベースの複数のSQLインスタンスへの読み取り専用アクセス権を持つデータベースユーザーを追加する利点を調べてみましょう。

    要件:サンプルデータベースの複数のインスタンスにReadOnlyユーザーを追加する

    データベース開発者またはDBAは、Sqlcmdを使用したスクリプトを介して、複数のSQLインスタンスのサンプルデータベースへの読み取り専用アクセス権を持つデータベースユーザーを追加する必要があります。

    前提条件

    このタスクは、マシンに少なくとも2つのSQLインスタンスがインストールされており、両方にサンプルデータベース「University」があり、両方のデータベースに対してデータベースユーザー名ReadOnly(読み取り専用アクセス)を作成する必要があることを前提としています。

    >

    別のSQLインスタンスでのサンプルデータベースの作成

    2番目のSQLインスタンスで「University」サンプルデータベースをすでに作成している場合は、この手順をスキップしてください。

    まず、[コマンドの実行]ウィンドウで次のコードを実行して、別のSQLインスタンスに接続します。

    sqlcmd –S <computername>\<sqlinstancename>

    目的のSQLインスタンスに接続したら、記事の冒頭のコードを使用して「大学」データベースを作成してください(または私の記事「コマンドラインからのT-SQLステートメントの実行の基本」を参照してください)。 SQLCMDを使用する ‘)。

    読み取り専用データベースユーザーを追加するスクリプトファイルを作成する

    以下のスクリプトをコピーして、メモ帳に AddReadOnyUniversityDatabaseUser.sqlとして保存します。 C:\ SQLScriptsのファイル テスト用のフォルダ。

    -- 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

    最初のSQLインスタンスに接続し、Sqlcmdを使用してスクリプトを実行します

    cmd 」と入力して、コマンドプロンプトを開きます ‘ 検索ボックスで。次に、次の行を実行します。

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

    どこ "。" (ドット)は、選択した特定のSQLインスタンスで置き換えることができるデフォルトの名前のないSQLインスタンスを示します。

    2番目のSQLインスタンスに接続し、Sqlcmdを使用してスクリプトを実行します

    次に、コマンドラインを開き、次のコードを使用してSQLスクリプトを実行します。これにより、別のSQLインスタンスにデータベースユーザーが作成されます。

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

    「SQLTAB」は、マシンにインストールされているSQLインスタンスの名前に置き換える必要があることに注意してください。

    おめでとう! Sqlcmdユーティリティを使用してスクリプトファイルを実行するだけで、複数のSQLインスタンスでサンプルデータベースへの読み取り専用アクセス権を持つデータベースユーザーが正常に作成されました。

    直接モード(目的のSQLインスタンスに接続した後のT-SQLコードの入力)と間接モード(Sqlcmdがコマンドラインから目的のSQLインスタンス上のデータベースに対してスクリプトを実行する場合)の両方でSqlcmdを使用することにより、さまざまなデータベースタスクを簡素化する方法を学びました。 。

    やるべきこと

    sqlcmdユーティリティを使用して読み取り専用権限を持つデータベースユーザーを追加するなどのデータベースタスクを実行する準備ができたので、次のことを試してスキルをさらに向上させることができます。

    1. 私の記事で説明したサンプルデータベースSQLBookShopの読み取り専用アクセス権を持つデータベースユーザーを作成してみてください。ただし、後でsqlcmdユーティリティの使用について説明するストアドプロシージャは除きます。
    2. 私の記事に記載されているストアドプロシージャのいずれかを含むSQLBookShopデータベースのsqlcmdユーティリティを介して実行されるスクリプトファイルを介して、読み取り専用アクセス権を持つデータベースとデータベースユーザーを作成してみてください。
    3. スクリプトファイルを作成し、Sqlcmdユーティリティを使用してテスト実行し、複数のSQLインスタンスでサンプルデータベースUniversityから以前に追加された読み取り専用ユーザーを削除します。

    便利なツール:

    dbForge Studio for SQL Server – SQL Serverの管理、管理、開発、データレポート、および分析のための強力なIDE。


    1. MySQLテーブル、インデックス、およびデータの複製

    2. MySQLでテーブルを作成する

    3. SQL Server SHOWPLAN_TEXT

    4. SQLServerの地理データ型を理解する方法