Share via


ユーザー、ロール、およびログインの管理

SMO では、Login オブジェクトでログインが表現されます。ログオンが SQL Server に存在する場合、サーバー ロールに追加することができます。サーバー ロールは、ServerRole オブジェクトで表現されます。データベース ロールは DatabaseRole オブジェクトで表現され、アプリケーション ロールは ApplicationRole オブジェクトで表現されます。

サーバー レベルに関連付けられた権限は、ServerPermission オブジェクトのプロパティとしてリストされます。サーバー レベル権限は、個々のログオン アカウントに対して、許可、拒否、取り消しを行うことができます。

Database オブジェクトには、データベース内のすべてのユーザーを指定する UserCollection オブジェクトがあります。各ユーザーはログオンに関連付けられています。1 つのログオンを 2 つ以上のデータベース内のユーザーに関連付けることもできます。ログオンに関連付けられた各データベース内のすべてのユーザーをリストするには、Login オブジェクトの EnumDatabaseMappings メソッドを使用します。または、User オブジェクトの Login プロパティで、ユーザーに関連付けられたログオンを指定します。

SQL Server データベースには、ユーザーに対して特定のタスクの実行を許可するための、データベース レベル権限のセットを指定するロールもあります。サーバー ロールと異なり、データベース ロールは固定されていません。データベース ロールは、作成、変更、および削除を行うことができます。権限およびユーザーは、データベースに割り当てて、一括管理することができます。

次のコード例では、アプリケーションを作成するプログラミング環境、プログラミング テンプレート、およびプログラミング言語を選択する必要があります。詳細については、「Visual Studio .NET で Visual Basic SMO プロジェクトを作成する方法」および「Visual Studio .NET で Visual C# SMO プロジェクトを作成する方法」を参照してください。

Visual Basic でのログインおよび関連付けられたユーザーの列挙

データベース内の各ユーザーは、ログオンに関連付けられています。ログオンは 2 つ以上のデータベース内のユーザーに関連付けることもできます。コード例では、Login オブジェクトの EnumDatabaseMappings メソッドを呼び出して、ログオンに関連付けられているすべてのデータベース ユーザーをリストする方法を示します。この例では、AdventureWorks2008R2 データベースのログオンおよびユーザーを作成して、列挙するマッピング情報の存在を確認します。

'Connect to the local, default instance of SQL Server.
Dim srv As Server
srv = New Server
'Iterate through each database and display.
Dim db As Database
For Each db In srv.Databases
    Console.WriteLine("============================================")
    Console.WriteLine("Login Mappings for the database: " + db.Name)
    Console.WriteLine(" ")
    'Run the EnumLoginMappings method and return details of database user-login mappings to a DataTable object variable.
    Dim d As DataTable
    d = db.EnumLoginMappings
    'Display the mapping information.
    Dim r As DataRow
    Dim c As DataColumn
    For Each r In d.Rows
        For Each c In r.Table.Columns
            Console.WriteLine(c.ColumnName + " = " + r(c))
        Next
        Console.WriteLine(" ")
    Next
Next

Visual C# でのログインおよび関連付けられたユーザーの列挙

データベース内の各ユーザーは、ログオンに関連付けられています。ログオンは 2 つ以上のデータベース内のユーザーに関連付けることもできます。コード例では、Login オブジェクトの EnumDatabaseMappings メソッドを呼び出して、ログオンに関連付けられているすべてのデータベース ユーザーをリストする方法を示します。この例では、AdventureWorks2008R2 データベースのログオンおよびユーザーを作成して、列挙するマッピング情報の存在を確認します。

{ 
Server srv = new Server(); 
//Iterate through each database and display. 

foreach ( Database db in srv.Databases) { 
   Console.WriteLine("===================================="); 
   Console.WriteLine("Login Mappings for the database: " + db.Name); 
   Console.WriteLine(" "); 
   //Run the EnumLoginMappings method and return details of database user-login mappings to a DataTable object variable. 
   DataTable d;
   d = db.EnumLoginMappings(); 
   //Display the mapping information. 
   foreach (DataRow r in d.Rows) { 
      foreach (DataColumn c in r.Table.Columns) { 
         Console.WriteLine(c.ColumnName + " = " + r[c]); 
      } 
      Console.WriteLine(" "); 
   } 
} 
}

PowerShell でのログインおよび関連付けられたユーザーの列挙

データベース内の各ユーザーは、ログオンに関連付けられています。ログオンは 2 つ以上のデータベース内のユーザーに関連付けることもできます。コード例では、Login オブジェクトの EnumDatabaseMappings メソッドを呼び出して、ログオンに関連付けられているすべてのデータベース ユーザーをリストする方法を示します。この例では、AdventureWorks2008R2 データベースのログオンおよびユーザーを作成して、列挙するマッピング情報の存在を確認します。

# Set the path context to the local, default instance of SQL Server.
CD \sql\localhost\Default\Databases


#Iterate through all databases
 foreach ($db in Get-ChildItem)
 {
 "==============================================="
 "Login Mappings for the database: "+ $db.Name
 
 #get the datatable containing the mapping from the smo database oject
 $dt = $db.EnumLoginMappings()
 
 #display the results
 foreach($row in $dt.Rows)
     {
        foreach($col in $row.Table.Columns)
      {
        $col.ColumnName + "=" + $row[$col]
       }
 
     }
 }

ロールおよびユーザーの管理

このサンプルでは、ロールおよびユーザーの管理方法を示します。最初のサンプルでは C# を使用し、2 番目のサンプルでは Visual Basic を使用しています。これらのサンプルでは、次に示すアセンブリへの参照が必要です。

  • Microsoft.SqlServer.Smo.dll

  • Microsoft.SqlServer.Management.Sdk.Sfc.dll

  • Microsoft.SqlServer.ConnectionInfo.dll

  • Microsoft.SqlServer.SqlEnum.dll

using Microsoft.SqlServer.Management.Smo;
using System;

public class A {
   public static void Main() {
      Server svr = new Server();
      Database db = new Database(svr, "TESTDB");
      db.Create();

      // Creating Logins
      Login login = new Login(svr, "Login1");
      login.LoginType = LoginType.SqlLogin;
      login.Create("password@1");

      Login login2 = new Login(svr, "Login2");
      login2.LoginType = LoginType.SqlLogin;
      login2.Create("password@1");

      // Creating Users in the database for the logins created
      User user1 = new User(db, "User1");
      user1.Login = "Login1";
      user1.Create();

      User user2 = new User(db, "User2");
      user2.Login = "Login2";
      user2.Create();

      // Creating database permission Sets
      DatabasePermissionSet dbPermSet = new DatabasePermissionSet(DatabasePermission.AlterAnySchema);
      dbPermSet.Add(DatabasePermission.AlterAnyUser);

      DatabasePermissionSet dbPermSet2 = new DatabasePermissionSet(DatabasePermission.CreateType);
      dbPermSet2.Add(DatabasePermission.CreateSchema);
      dbPermSet2.Add(DatabasePermission.CreateTable);

      // Creating Database roles
      DatabaseRole role1 = new DatabaseRole(db, "Role1");
      role1.Create();

      DatabaseRole role2 = new DatabaseRole(db, "Role2");
      role2.Create();

      // Granting Database Permission Sets to Roles
      db.Grant(dbPermSet, role1.Name);
      db.Grant(dbPermSet2, role2.Name);

      // Adding members (Users / Roles) to Role
      role1.AddMember("User1");

      role2.AddMember("User2");

      // Role1 becomes a member of Role2
      role2.AddMember("Role1");

      // Enumerating through explicit permissions granted to Role1
      // enumerates all database permissions for the Grantee
      DatabasePermissionInfo[] dbPermsRole1 = db.EnumDatabasePermissions("Role1");   
      foreach (DatabasePermissionInfo dbp in dbPermsRole1) {
         Console.WriteLine(dbp.Grantee + " has " + dbp.PermissionType.ToString() + " permission.");
      }
      Console.WriteLine(" ");
   }
}

Visual Basic バージョンを次に示します。

Imports Microsoft.SqlServer.Management.Smo

Public Class A
   Public Shared Sub Main()
      Dim svr As New Server()
      Dim db As New Database(svr, "TESTDB")
      db.Create()

      ' Creating Logins
      Dim login As New Login(svr, "Login1")
      login.LoginType = LoginType.SqlLogin
      login.Create("password@1")

      Dim login2 As New Login(svr, "Login2")
      login2.LoginType = LoginType.SqlLogin
      login2.Create("password@1")

      ' Creating Users in the database for the logins created
      Dim user1 As New User(db, "User1")
      user1.Login = "Login1"
      user1.Create()

      Dim user2 As New User(db, "User2")
      user2.Login = "Login2"
      user2.Create()

      ' Creating database permission Sets
      Dim dbPermSet As New DatabasePermissionSet(DatabasePermission.AlterAnySchema)
      dbPermSet.Add(DatabasePermission.AlterAnyUser)

      Dim dbPermSet2 As New DatabasePermissionSet(DatabasePermission.CreateType)
      dbPermSet2.Add(DatabasePermission.CreateSchema)
      dbPermSet2.Add(DatabasePermission.CreateTable)

      ' Creating Database roles
      Dim role1 As New DatabaseRole(db, "Role1")
      role1.Create()

      Dim role2 As New DatabaseRole(db, "Role2")
      role2.Create()

      ' Granting Database Permission Sets to Roles
      db.Grant(dbPermSet, role1.Name)
      db.Grant(dbPermSet2, role2.Name)

      ' Adding members (Users / Roles) to Role
      role1.AddMember("User1")

      role2.AddMember("User2")

      ' Role1 becomes a member of Role2
      role2.AddMember("Role1")

      ' Enumerating through explicit permissions granted to Role1
      ' enumerates all database permissions for the Grantee
      Dim dbPermsRole1 As DatabasePermissionInfo() = db.EnumDatabasePermissions("Role1")
      For Each dbp As DatabasePermissionInfo In dbPermsRole1
         Console.WriteLine(dbp.Grantee + " has " & dbp.PermissionType.ToString() & " permission.")
      Next
      Console.WriteLine(" ")
   End Sub
End Class