Когда роль становится доступной для пользователя в Oracle 10g? - PullRequest
3 голосов
/ 24 июня 2010

Я использую ADO.NET из C # 4 для настройки тестового контекста для компонента.

Я выполняю следующий SQL-запрос как sysdba:

new[]
{
    "create user \"{0}\" identified externally default tablespace USER_DATA temporary tablespace TEMP profile DEFAULT"
    .FormatWith( Config.QualifiedUserName ),
    "create role {0}"
    .FormatWith( Config.RoleName ),
    "grant {0} to \"{1}\""
    .FormatWith( Config.RoleName, Config.QualifiedUserName ),
    "insert into doc.application( id, name ) values( {0}, '{1}' )"
    .FormatWith( Config.AppId, Config.AppName ),
    "insert into doc.appl_role( application, role, description ) values( {0}, '{1}', '{2}' )"
    .FormatWith( Config.AppId, Config.RoleName, Config.RoleDescription ),
    "create table {0}.{1} ( ID number primary key, VERSION number, NAME varchar(100) )"
    .FormatWith( Config.TestSchema, Config.TestTable ),
    "insert into {0}.{1} (ID, VERSION, NAME) values ('{2}', '{3}', '{4}')"
    .FormatWith( Config.TestSchema, Config.TestTable, Config.TestRowId, 1, Config.TestRowName ),
    "grant select, insert, update, delete on {0}.{1} to {2}"
    .FormatWith( Config.TestSchema, Config.TestTable, Config.RoleName ),
    "grant create session to \"{0}\""
    .FormatWith( Config.QualifiedUserName )
} 

и класс Configвыглядит так:

public struct Config
{
    public const Int32 TestRowId = 1;
    public const Int32 AppId = 99999;
    public const String AppName = "OraceUtils";
    public const String RoleName = "ORACLE_UTILS_BASE";
    public static readonly String RoleDescription = "For testing {0}".FormatWith( AppName );
    public static readonly String QualifiedUserName = @"{0}\{1}".FormatWith( Domain, UserName );
    public const String DataSource = "TESTDB";
    public const String Domain = "BI";
    public const String UserName = "ORACLE_TEST_USER";
    public const String UserPassword = [for my eyes only];
    public const String TestSchema = "CI";
    public const String TestTable = "ROLE_PROVIDER_TEST_TABLE";
    public const String TestRowName = "Arne And";
}

Из того, что я прочитал, просто предоставление роли пользователю не позволяет ее включить.Однако после выполнения приведенного выше SQL пользователь BI \ ORACLE_TEST_USER может использовать таблицу ROLE_PROVIDER_TEST_TABLE очень хорошо.Роль ORACLE_UTILS_BASE также показана в SESSION_ROLES.

Если после этого я выдаю «SET ROLES», вышеупомянутый пользователь не сможет получить доступ к таблице.

Я думал, что это было наоборот, то естьу пользователя не будет доступа, пока он не выдаст «SET ROLES ORACLE_UTILS_BASE, [любые другие роли]».

1 Ответ

3 голосов
/ 24 июня 2010

Когда пользователь подключается к БД, все его роли по умолчанию включены. Вы можете изменить, какие роли по умолчанию с синтаксом:

ALTER USER <user> DEFAULT ROLE <role>

<role> может быть именем роли или ключевыми словами ALL или NONE

Когда вы предоставляете роль пользователю, она становится ролью по умолчанию (т. Е. Пользователю не нужно активировать ее с помощью SET ROLE <role> при подключении).

...