Управление пользователями, ролями и именами входа
В SMO имена входа представлены объектом Login. Если имя входа существует в SQL Server, его можно добавить в роль сервера. Роль сервера представлена объектом ServerRole. Роль базы данных представлена объектом DatabaseRole, а роль приложения представлена объектом ApplicationRole.
Права доступа уровня сервера перечислены в виде свойств объекта ServerPermission. Права доступа уровня сервера можно предоставлять, запрещать или отзывать для отдельных учетных записей входа.
У каждого объекта Database есть объект UserCollection, в котором указываются все пользователи базы данных. С каждым пользователем связано имя входа. Одно имя входа может быть связано с пользователями в нескольких базах данных. Метод EnumDatabaseMappings объекта Login используется для перечисления всех пользователей во всех базах данных, связанных с именем входа. И наоборот, свойство Login объекта User содержит имя входа, связанное с пользователем.
В базах данных SQL Server также есть роли, которые определяют набор прав доступа уровня базы данных, позволяющих пользователям выполнять определенные задачи. В отличие от ролей сервера, роли базы данных не являются фиксированными. Их можно создавать, изменять и удалять. Права доступа и пользователей можно назначать роли базы данных для пакетного администрирования.
Примеры
В следующем примере кода для создания приложения необходимо выбрать среду программирования, шаблон программирования и язык программирования. Дополнительные сведения см. в разделах Как создать проект SMO на языке Visual Basic в среде Visual Studio .NET и Как создать проект SMO на языке Visual C# в среде Visual Studio .NET.
Перечисление имен входа и связанных пользователей на языке Visual Basic
Каждый пользователь базы данных связан с именем входа. Имя входа может быть связано с пользователями в нескольких базах данных. В этом примере кода показан вызов метода EnumDatabaseMappings объекта Login для перечисления всех пользователей базы данных, связанных с именем входа. В примере создается имя входа и пользователь в базе данных База данных 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#
Каждый пользователь базы данных связан с именем входа. Имя входа может быть связано с пользователями в нескольких базах данных. В этом примере кода показан вызов метода EnumDatabaseMappings объекта Login для перечисления всех пользователей базы данных, связанных с именем входа. В примере создается имя входа и пользователь в базе данных База данных 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
Каждый пользователь базы данных связан с именем входа. Имя входа может быть связано с пользователями в нескольких базах данных. В этом примере кода показан вызов метода EnumDatabaseMappings объекта Login для перечисления всех пользователей базы данных, связанных с именем входа. В примере создается имя входа и пользователь в базе данных База данных 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#, а во втором — 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