一台主机只能mysql 仅允许指定主机一个人玩一个bf4,是吗

xcconfig 文件配置文件 问题 - Jenaral - 博客园
随笔 - 287, 文章 - 0, 评论 - 4, 引用 - 0
与公司 QA 聊天,已不止一次被吐槽说移动端从开发环境转到生产环境时,还要靠修改代码来配置对应的环境参数。她认为,从 App 转测试之后,就不应该再修改代码,可以把所有的环境配置都整合到配置文件中,这样打不同环境下的安装包时,会自动选择对应的环境参数。这里说到的环境参数包括但不仅限于: webservice 地址,友盟 AppKey,极光推送 AppKey 和是否是生产环境标志等。
其实,我也讨厌修改环境参数啊,?
为达成上述目的,主要是使用 Xcode 的 Configurations Setting File(即后缀为 xcconfig 文件) 来配置开发不同阶段下的环境。本文包含的内容如下:
包含了一些与 build settings 相关的知识。
Xcode Target
target, 官方文档如下解释:
A target specifies a product to build and contains the instructions for building the product from a set of files in a project or workspace. A target defi it organizes the inputs into the build system&the source files and instructions for processing those source files&required to build that product. Projects can contain one or more targets, each of which produces one product.
target 定义了生成的唯一 product, 它将构建该 product 所需的文件和处理这些文件所需的指令集整合进 build system 中。Projects 会包含一个或者多个 targets,每一个 target 将会产出一个 product.
The instructions for building a product take the form of build settings and build phases, which you can examine and edit in the Xcode project editor.&A target inherits the project build settings, but you can override any of the project settings by specifying different settings at the target level.&There can be only one act the Xcode scheme specifies the active target.
这些指令以 build setting 和 build phases 的形式存在,你可在 Xcode 的项目编辑器(TARGETS-&Build Setting, TARGETS-&Build Phases)中进行查看和编辑。target 中的 build setting 参数继承自 project 的 build settings, 但是你可以在 target 中修改任意 settings 来重写 project settings,这样,最终生效的 settings 参数以在 target 中设置的为准. Project 可包含多个 target, 但是在同一时刻,只会有一个 target 生效,可用 Xcode 的 scheme 来指定是哪一个 target 生效.
A target and the product it creates can be related to another target. If a target requires the output of another target in order to build, the first target is said to depend upon the second. If both targets are in the same workspace, Xcode can discover the dependency, in which case it builds the products in the required order. Such a relationship is referred to as an implicit dependency. You can also specify explicit target dependencies in your build settings, and you can specify that two targets that Xcode might expect to have an implicit dependency are actually not dependent. For example, you might build both a library and an application that links against that library in the same workspace. Xcode can discover this relationship and automatically build the library first. However, if you actually want to link against a version of the library other than the one built in the workspace, you can create an explicit dependency in your build settings, which overrides this implicit dependency.
target 和其生成的 product 可与另一个 target 有关,如果一个 target 的 build 依赖于另一个 target 的输出,那么我们就说前一个 target 依赖于后一个 target .如果这些 target 在同一个 workspace 中,那么 Xcode 能够发现这种依赖关系,从而使其以我们期望的顺序生成 products.这种关系被称为隐式依赖关系。同时,你可以显示指定 targets 之间的依赖关系,并且这种依赖关系会覆盖 Xcode 推测出的隐式依赖关系。
指定 targets 之间的依赖关系的地方在 Project Editor-&TRAGETS-&Build Phases-&Target Dependencies 处设置。如下图所示:
添加targets间的依赖关系
Xcode Project
官方文档的解释如下:
An Xcode project is a repository for all the files, resources, and information required to build one or more software products. A project contains all the elements used to build your products and maintains the relationships between those elements. It contains one or more targets, which specify how to build products. A project defines default build settings for all the targets in the project (each target can also specify its own build settings, which override the project build settings).
Xcode project 是一个仓库,该仓库包含了所有的文件,资源和用于生成一个或者多个 software products 的信息。它包含一个或者多个 targets,其中的每一个 target 指明了如何生成 products。project 为其拥有的所有 targets 定义了默认的 build settings,当然,每一个 target 能够制定其自己的 build settings,且 target 的 build settings 会重写 project 的 build settings。
Xcode project 文件包含以下信息:
源文件的引用:
源码,包括头文件和实现文件
内部和外部的库或者框架
Interface Builder(nib)文件
文件结构导航中用来组织源文件的组
Project-level build configurations.你可以为 project 指定多个 build configuration,例如,project 中默认包含 debug 和 release 两种 build settings.
Targets, 每一个 target 指定了:
project 生成的 product
生成 product 所需的源文件
生成 product 所需的配置文件,包括对其他 targets 的依赖以及一些其他设置;当 targets 的 build configurations 没有重写 project-level 的 build settings 时,会直接使用 project-level 的 build setting.
可执行环境,该环境用于调试或者测试程序,每个可执行环境会指定:
运行或者调试程序时加载的可执行程序
传递给可执行程序的命令行参数
运行程序时需设置的环境变量
project 可独立存在,也可被包含在 workspace 中。
Build Setting 的继承关系
官方文档内容如下:
A build setting is a variable that contains information about how a particular aspect of a product&s build process should be performed. For example, the information in a build setting can specify which options Xcode passes to the compiler.
You can specify build settings at the project or target level. Each project-level build setting applies to all targets in the project unless explicitly overridden by the build settings for a specific target.
build setting 中包含了 product 生成过程中所需的参数信息。你可以在 project-level 和 target-level 层指定 build settings。project-level 的 build settings 适用于 project 中的所有targets,但是当 target-level 的 build settings 重写了 project-level 的 build settings,以 target-level 中的 build settings 中的值为准。
Each target organizes the source files needed to build one product. A build configuration specifies a set of build settings used to build a target&s product in a particular way. For example, it is common to have separate build configurations for debug and release builds of a product.
一个 build configaration 指定了一套 build settings 用于生成某一 target 的 product,例如,在 Xcode 创建项目时默认就有两套独立的 build configarations, 分别用于生成 debug 和 release 模式下的 product。
In addition to the default build settings provided by Xcode when you create a new project from a project template, you can create user-defined build settings for your project or for a particular target. You can also specify conditional build settings. The value of a conditional build setting depends on whether one or more prerequisites are met. This mechanism allows you to, for example, specify the SDK to use to build a product based on the targeted architecture.
除了创建工程时生成的默认 build settings,你也可以自定义 project-level 或者 target-level 的 build settings.
关于继承关系,&这里也有详细的说明,强烈建议阅读。
现在就来看看如何使用自定义的 build settings 来达到本文开始处提到的需求.
如何使用 xcconfig 文件来配置不同开发阶段的环境
目前公司中的开发大致分两个阶段,第一阶段:开发阶段,此时所打包都是使用 development 的证书,极光和友盟统计的账号都是使用开发者自己申请的账号,webservice 的地址使用开发环境地址;第二阶段:uat 阶段,此时属于预发版阶段,此时打包使用 ad-hoc 的证书,极光和友盟统计的账号使用公司申请生成账号,webservice 使用的特定的预发版环境;另外,打上传到 App Store 的生产包,使用 distribution 的证书,webservice 的地址使用生产环境的地址。
由此,可新建一种 build configuration, 由 Xcode 自动生成的 Release 复制而来,如下所示:
新建Configurations
并命名为 PreRelease。
官方文档&中如下提到:
A configuration file is a plain text file with a list of build setting definitions, one per line. You can base a build configuration only on a configuration file that is in your project, not on an external file.
When you base a target or project&s build configuration on a configuration file, that build configuration automatically inherits the build setting definitions in that configuration file (and any configuration files it includes). If you then modify the value of any of those build settings in the target or project, the new value is used instead of the value in the configuration file.
Build settings defined at the target level override any values assigned to those build settings at the project level. Therefore, target-level configurations take precedence over any project-level configurations.
这里需要注意的是:当你的 target-level 或者 project-levle 的 build configurations 基于配置文件时,build configuration 会自动继承配置文件(以及配置文件中引入的配置文件)中定义的 build settings,但是如果你又在之后 target 或者 project 中修改了配置文件中定义的 build settings 值,那么最终配置文件中的值会失效,实际使用的是 target 或者 project 中设置的值。
这里鉴于公司的情况,新建了 Debug.xcconfig/PreRelease.xcconfig/Release.xcconfig 配置对应于开发阶段、预发版阶段、上传 AppStore 三种情况下的打包。
新建一个 xcconfig 目录,在该目录下新建配置文件:
创建配置文件
根据项目情况,每个配置文件中都包含同样的 key 值,内容大致如下:
1234567891011
你可在配置文件中包含其他配置文件,其中 Generator.xcconfig 文件的内容是:
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) WEBSERVICE_URL='$(WEBSERVICE_URL)' MESSAGE_SYSTEM_URL='$(MESSAGE_SYSTEM_URL)' UMENG_APPKEY='$(UMENG_APPKEY)'
IS_PRODUCATION='$(IS_PRODUCATION)'
其作用是将配置文件中定义的常量定义成预编译宏,以便于在代码中获取。
其中 GCC_PREPROCESSOR_DEFINITIONS, 文档如下:
Space-separated list of option specifications. Specifies preprocessor macros in the form foo (for a simple #define) or foo=1 (for a value definition). This list is passed to the compiler through the gcc -D option when compiling precompiled headers and implementation files.
GCC_PREPROCESSOR_DEFINITIONS 是 GCC 预编译头参数,通常我们可以在 Project 文件下的 Build Settings 对预编译宏定义进行默认赋值。在 Xcode7 下的路径为 Build Settings-&Apple LLVM 7.x Preprocessing-&Preprocessor Macros,
GCC_PREPROCESSOR_DEFINITIONS
想必大家看这个宏的名字已经知道它的作用了, 使用上和在 pch 头文件中添加宏定义没有太大的区别, 但有以下好处:
Xcode 的 Project 的 Build Settings 是由一个 plist 文件进行描述的, plist 本质上是一个 XML 配置文件, 通过外部的脚本比较容易去修改。
Preprocessor Macros 可以按照 Configuration 选项进行默认配置, 也就是说可以根据不同的环境预先制定不同定义的宏,或者为不同环境下的相同变量定义不同的值
xcconfig 支持可以根据不同的 Configuration 选项配置不同的文件。不同的 xcconfig 可以指定不同的 Build Settings 里的属性值, 这样子我们就可以通过项目 xcconfig 去修改 GCC_PREPROCESSOR_DEFINITIONS 的值了(最终目的就达到了)。
配置文件中变量定义好之后,怎么让 Xcode 自动加载呢?如下图设置所示,是将 project-level 的 build settings 基于配置文件,三种情况的 configurations 分别选择与之对应的配置文件。
将配置文件与项目关联
当我们想把 project-level 或者 target-level 中的 Build Settings 的设置挪动到 xcconfig 配置文件来设置时,是否需要一个个手动输入呢?当然不是,直接在 Build Settings 中选中你想要在 xcconfig 中配置的键值对所在行(当然也可以选多行),command + c复制,然后到对应的 xcconfig 中去粘贴就好了,记得在 Build Settings 中改为你想要的值后再复制,如果为默认值的话则只可复制其键。如果需要改回去的话,还是选中这行,command + delete&就恢复默认值了。
现在我们将设置挪动到了配置文件中,所有的配置文件都是键值对类型的文本文件,但是当同一个键同时存在于 target-level、project-level 和配置文件中时,到底是哪一个键值对起作用了呢?现在看看下图。
多个配置项列
注意: Xcode以从左至右的顺序设置解析的优先级,从左至右优先级降低,最左边的具有最高优先级,即 target-level & project-level & 自定义配置文件 & iOS 默认配置;且最左列 Resolved 列显示的是最终使用的值。那么如何使 Xcode 使用配置文件中的配置项呢?这需要选中要使用配置文件的行,点击 Delete 按键,你会发现项目的默认设置已经被删除,且 xcconfig 的配置文件列被标记为绿色。标记为绿色代表该列的值生效,其值应该与 Resolved 列的值相同。
最后,你可以像如下示例使用 xcconfig 中定义的宏:
NSLog(@"webservice url: %@, umeng appkey: %@", WEBSERVICE_URL, UMENG_APPKEY);
通过以上步骤,就达到了使用 xcconfig 文件来配置开发不同阶段时的环境变量的目的了。
让我们来看看 XCConfig 文件如何才能在多个拥有不同配置的 target 中良好地工作。
今天我本计划学习一些新东西,因此我搜索了&&库(译者:这是在火狐浏览器在 github 的一个开源项目)的相关信息,接着我发现他们会在项目中使用大量的配置文件。
我曾经在几个项目中使用过 XCConfig ,但是我并没有在现在开发的项目中使用它。因为这个项目有多个不同配置的 target,因此我开始思考如何才能有效且简单地管理这些 target 。
这个项目现在已经被我的团队接手了。客户的团队先开发了大约半年的时间,最后决定将项目完全外包出去。这个项目一个麻烦的事就是 target 有不同的配置,因此如何更好地解决,是个棘手的问题。
项目由十个应用 target 组成,2个总的 target 做些业务,以及一个测试 target 。每一个 target 使用不同的尾部和不同的 &api keys&,以及其他像用于 hockeyapp(HockeyApp 是一个用来分发你的程序并收集应用的崩溃报告的收集框架,类似友盟) token 的键(key)。每一个 target 有自己的预处理宏,如:&TARGET_A&, &TARGET_B&等...(虚构的名字)。然后,token,api keys,后端的 url 被存储在 plist 文件中。因此很自然需要一些类来封装这个文件,并且有语法分析程序以及可以提供给我们适当的键。这个类有超过200行的代码,对我来说仅仅阅读这些数据就要花费很多时间。
因此,我想或许可以使用 XCConfig 文件来简化和替代,而不是使用语法分析程序和十个个预处理宏(一个 target)去决定从 plist 文件应该返回什么值。你可以在下面找到我的解决方案。可能不是最好的方案,但是此刻应该是最好的。如果你有更好的方案,我很愿意去拜读 :)
核心思想是使用一些有层级的配置文件。第一层是用于存储最普通的数据,第二层用于区分 debug 和 release 模式,最后一层用于关联特殊 target 的设置。
这个文件存储着类似应用名称,应用版本,bundle version,以及其他 debug和 release target 中通用的常见配置。
考虑到为十个 target 改变相应的应用版本和 bundle 可能会消耗很多时间。其他的选项可能会创建聚合的 target ,这样可以在每次 Cmd+B的时候更新Info-plist 文件,但是我会避免这样的情况并且让项目不会比现在更复杂。
这个文件能够存储可用于 debug 和 release target 的最常用配置。文件包含 Common.xcconfig 并且能够重写它的变量。例如:你可以通过重写一个变量,轻易地把每个 debug target 的应用名称改为 &App Debug& 。对于存储常见的用于开发和发行版本 target 的 API Key,这里也是很好的地方。
提示:使用通用配置文件和 CocoaPods
如果你使用 CocoaPods,你应该相应地在你的配置文件之一中包括(include)Pods.debug.xcconfig 或者 Pods.release.xcconfig。我推荐先在项目信息标签中设置你的配置文件然后执行&pod install&去让 Pod 项目重新配置。在安装之后,你应该及时地把 Pod 配置文件中的其中一个包括(include)到你自己的文件中去。
[!] CocoaPods did not set the base configuration of your project because your project already has a custom config set. In order for CocoaPods integration to work at all, please either set the base configurations of the target TARGET_NAME to Pods/Target Support Files/Pods/Pods.debug.xcconfig or include the Pods/Target Support Files/Pods/Pods.debug.xcconfig in your build configuration.
Common.debug.xcconfig
&truncated&
#include "Common.xcconfig"
#include "Pods/Target Support Files/Pods/Pods.debug.xcconfig"
APP_NAME = App Debug
API_KEY_A = API_KEY_HERE
API_KEY_B = API_KEY_HERE
我确实不需要在这个层级使用 debug/release 配置文件(因为项目中的其他遗留问题),所以我只是用包括适当的 Common.debug.xcconfig 或者 Common.release.xcconfig 的 PerTarget.xcconfig 文件。但是最好应该有 debug 和 release 配置文件。在这个层级,你可以配置关联到特殊 target 的东西。
所有的配置文件被存储了。现在是时候去使用他们了。像我例子中有这么多的 target,我可以把 Info.plist 文件的数量减少到只有1个,由于所有的不同的地方都已经在 xcconfig 文件中了,所以这一个文件可以替代多个文件。
你可以看到在你通过这些配置文件构建应用之后,有一些值出现在项目的 Build Setting 的 &User-Defined& 部分。
如果你想要使用配置文件中的变量,例如,在一个target的 Info.plist 文件中,你需要使用这种写法:$(VARIABLE)。使用这种方式,你可以设置 &Bundle Identifier& , &Bundle name& , &Bundle version& 以及其他你想要配置的事项。
在代码中访问其他变量看起来有点不一样,我发现最简单的方法就是在 Info.plist 中创建附加的区域,通过使用相同的变量名称和使用上述的写法去设置值。这样你就可以在你的代码中读到这些值。
if let dictionary = NSBundle.mainBundle().infoDictionary {
let appName = dictionary["APP_NAME"] as! String
let appVersion = dictionary["APP_VERSION"] as! String
let appBuildVersion = dictionary["APP_BUILD_VERSION"] as! String
print("\(appName) \(appVersion) (\(appBuildVersion))")
let backend = (dictionary["BACKEND_URL"] as! String).stringByReplacingOccurrencesOfString("\\", withString: "")
print("backend: \(backend)")
这里是&&的代码,从里面你可以看到一些使用 xcconfig 文件的例子。
Xcode 配置文件给出了配置 target 的简易方式,并且支持方便地维护项目配置。在我用例中,可以很棒地切换到这些文件,因为现在维护项目配置和我没有使用这个解决方案之前比起来简单了很多。
参考链接:
1.//use-xcconfig-config-specific-variable/
3./xcode-xcconfig-files-for-managing-targets-configurations/10344人阅读
-----Oracle相关特性(50)
--================================
--Oracle 角色、配置文件
--================================
&&& 1.角色
&&&&&&&&&& 权限的集合,可以分配给一个用户或其他角色,但角色不能授予自己,也不能循环授予
&&&&&& 角色的优点
&&&&&&&&&& 可以先创建角色,向该角色赋予一系列权限,然后再将该角色授予多个用户或角色
&&&&&&&&&& 增加或删除角色中的某一权限,被授予该角色的所有用户或角色自动地获得新增权限或删除旧的权限
&&&&&&&&&& 可以为角色设置密码
&&&&&&&&&&
&&& 2.创建修改角色
&&&&&& CREATE ROLE role_name
&&&&&& [NOT IDENTIFIED(默认) | IDENTIFIED BY password | EXTERNALLY |GLOBALLY];
&&&&&& 注:同一个数据库中角色名称必须唯一,且不能使用已存在的用户名称
&&&&&&&&&& 不支持with grant option 为角色授予对象权限
&&&&&&&&&& 支持with admin option 为角色授予系统权限或另一个角色
&&&&&&&&&& 使用Enterprise Manager创建某个用户时,该用户被自动授予了CONNECT角色,
&&&&&&&&&& 即同时具有了该角色的所有权限
&&&&&&&&&&
&&&&&& IDENTIFIED BY EXTERNALLY
&&&&&&&&&& 意味着了启用一个角色,用户必须是某个操作系统组的一个成员,该操作系统组的名称应当与角色相对应。
&&&&&&&&&& 当希望通过操作系统对角色进行身份认证,则需要设置OS_ROLE参数为TRUE
&&&&&&&&&& 且当设定了使用IDENTIFIED BY EXTERNALLY身份验证,必须在数据库驻留的服务器上按以下格式创建组
&&&&&&&&&&&&& ora_&SID&_&ROLE&[_[d][a]]
&&&&&&&&&& d:指示&ROLE&部分指定的角色为用于用户的默认角色
&&&&&&&&&& a:指示可以使用with admin option为用户授予&ROLE&部分所指定的角色&&&&&&
&&&&&& 关于外部身份验证,请参考:
&&&&&& 常用的角色
&&&&&&&&&&
&&&&&&&&&& 角色&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 被授予的权限
&&&&&&&&&& DBA&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&几乎所有系统权限
&&&&&&&&&& SELECT_CATALOG_ROLE&&&&&&&&&&&&&&&& 数据字典上的对象权限,未被授予任何系统权限
&&&&&&&&&& EXECUTE_CATALOG_ROLE&&&&&&&&&&&&&&& 数据字典上的程序包、过程、函数的对象权限
&&&&&&&&&& DELETE_CATALOG_ROLE&&&&&&&&&&&&&&&& DELETE ON SYS.AUD$
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& DELETE ON SYS.FGA_LOG$
&&&&&&&&&& EXP_FULL_DATABASE&&&& &&&&&&&&&& 从数据库中导出数据时查询任何表或序列、执行任何过程或类型以及修改
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 数据字典对象的权限
&&&&&&&&&& IMP_FULL_DATABASE&&&&&&&&&&&&&& 执行导入时,在数据库内除了sys模式之外的任何模式中创建对象的权限&&&
&&&&&&&&&& CONNECT&&&&&&&&&&&&&&&&&&&&&&&&&&&& ALTER SESSION
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& CREATE CLUSTER
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& CREATE DATABASE LINK
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& CREATE SEQUENCE
&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& CREATE SESSION
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& CREATE SYNONYM
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& CREATE TABLE
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& CREATE VIEW
&&&&&&&&&& RESOURCE&&&&&&&&&&&&&&&&&&&&&&&&&&& CREATE CLUSTER
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& CREATE INDEXTYPE
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& CREATE OPERATOR
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& CREATE PROCEDURE
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& CREATE SEQUENCE
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& CREATE TABLE
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& CREATE TRIGGER
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& CREATE TYPE
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& UNLIMITED TABLESPACE (when granted)
&&&&&&&&&& AQ_ADMINISTRATOR_ROLE&&&&&&&&&&&&&& Advanced Queuing 对象上的对象权限
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& CREATE EVALUATION CONTEXT
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& CREATE RULE
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& CREATE RULE SET
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& DEQUEUE ANY QUEUE
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ENQUEUE ANY QUEUE
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& MANAGE ANY QUEUE
&&&&&&&&&& AQ_USER_ROLE&&&&&&&&&&&&&&&&&&&&&&& EXECUTE ON SYS.DBMS_AQ
&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&& EXECUTE ON SYS.DBMS_AQIN
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& EXECUTE ON SYS.DBMS_AQJMS_INTERNAL
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& EXECUTE ON SYS.DBMS_TRANSFORM
&&&&&&&&&& SCHEDULER_ADMIN&&&&&&&&&&&&&&&&&&&& CREATE ANY JOB
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& CREATE JOB
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& EXECUTE ANY CLASS
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& EXECUTE ANY PROGRAM
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& MANAGE SCHEDULE
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& (使用WITH ADMIN OPTION授予上述所有权限)
&&&&&&&&&& PUBLIC &&&&&&&&&&&&&&&&& &&&不具有特殊的权限,不过为public角色授予权限时,所有用户都会继承该权限
&&&&&&&&&&
&&&&&&&&&& --创建不要口令的角色clerk
&&&&&&&&&&&&& SQL& CREATE ROLE
&&&&&&&&&& --创建要口令的角色sales
&&&&&&&&&&&&& SQL& CREATE ROLE sales IDENTIFIED BY
&&&&&&&&&& --创建一个需要使用外部标识(如操作系统)的角色manager
&&&&&&&&&&&&& SQL& CREATE ROLE manager IDENTIFIED EXTERNALLY;
&&&&&&&&&& --创建后查看角色:
&&&&&&&&&&&&& SQL& SELECT role,password_required FROM dba_
&&&&&&&&&&&&& ROLE&&&&&&&&&&&&&&&&&&&&&&&&&& PASSWORD
&&&&&&&&&&&&& ------------------------------ --------
&&&&&&&&&&&&& CLERK&&&&&&&&&&&&&&&&&&&&&&&&& NO
&&&&&&&&&&&&& SALES&&&&&&&&&& &&&&&&&&&&&&&&&YES
&&&&&&&&&&&&& MANAGER&&&&&&&&&&&&&&&&&&&&&&& EXTERNAL
&&&&&& 角色修改:
&&&&&&&&&& ALTER ROLE rolename
&&&&&&&&&& [NOT IDENTIFIED | IDENTIFIED
&&&&&&&&&& BY password | EXTERNALLY | GLOBALLY];
&&&&&&&&&& 一个角色在创建后可以修改,但只能修改它的验证方法。
&&&&&&&&&& 但只有角色是使用带有with ADMIN option 选项的GRANT 语句授予的或者具
&&&&&&&&&& 有ALTER ANY ROLE 系统权限的用户时,才可以修改这个角色
&&&&&&&&&& --将角色clerk 的验证方法改为使用外部(如操作系统)标识
&&&&&&&&&&&&& SQL& ALTER ROLE clerk IDENTIFIED EXTERNALLY;
&&&&&&&&&& --将角色sales 的验证方法改为不使用任何标识方法
&&&&&&&&&&&&& SQL& ALTER ROLE sales NOT IDENTIFIED;
&&&&&&&&&& --将角色manager 的验证方法改为使用口令标识,口令为vampire
&&&&&&&&&&&&& SQL& ALTER ROLE manager IDENTIFIED BY vampires;
&&&&&&&&&& --再查询后即可看到变化
&&&&&&&&&&&&& SELECT role,password_required FROM dba_roles
&&& 3.为角色授予和取消权限
&&&&&& a.角色授权&
&&&&&&&&&& 为角色授予系统权限语法
&&&&&&&&&&&&& GRANT system_priv [, system_priv, ...]
&&&&&&&&&&&&& TO role | PUBLIC [, role | PUBLIC, ...]
&&&&&&&&&&&&& [WITH ADMIN OPTION];
&&&&&&&&&&
&&&&&& &&& 为角色授予对象权限语法
&&&&&&&&&&&&& GRANT ALL [PRIVILEGES] | object_priv [(column, column, ...)]
&&&&&&&&&&&&& [, object_priv [(column, column, ...(] , ...]
&&&&&&&&&&&&& ON [schema_name.]object_name
&&&&&&&&&&&&& TO role | PUBLIC [, role | PUBLIC, ...];
&&&&&&&&&&
&&&&&&&&&& --为角色赋予权限(GRANT):
&&&&&&&&&&&&& SQL& show user;
&&&&&&&&&&&&& USER is "SYSTEM"
&&&&&&&&&&&&& SQL& CREATE ROLE manager;
&&&&&&&&&&&&& Role created.
&&&&&&&&&&&&&
&&&&&&&&&&&&& --赋予系统权限
&&&&&&&&&&&&& SQL& GRANT CREATE TABLE,CREATE VIEW,CREATE SESSION TO manager WITH ADMIN OPTION;
&&&&&&&&&&&&& Grant succeeded.
&&&&&&&&&&&&&
&&&&&&&&&&&&& --赋予对象权限
&&&&&&&&&&&&& SQL& GRANT SELECT ,INSERT ,UPDATE ON scott.emp TO manager;
&&&&&&&&&&&&& Grant succeeded.
&&&&&&&&&& --查看角色的系统权限(role_sys_privs)
&&&&&&&&&&&&& SQL& SELECT * FROM role_sys_privs WHERE role = 'MANAGER';
&&&&&&&&&&&&&
&&&&&&&&&&&&& ROLE&&&&&&&&&&&&&&&&&&&&&&&&&& PRIVILEGE&&&&&&&&&&& ADM
&&&&&&&&&&&&& ------------------------------ -------------------- ---
&&&&&&&&&&&&& MANAGER&&&&&&&&&&&&&&&&&&&&&&& CREATE SESSION&&&&&& YES
&&&&&&&&&&&&& MANAGER&&&&&&&&&&&&&&&&&&&&&&& CREATE TABLE&&&&&&&& YES
&&&&&&&&&&&&& MANAGER&&&&&&&&&&&&&&&&&&&&&&& CREATE VIEW&&&&&&&&& YES
&&&&&&&&&&
&&&&&&&&&& --查看角色的对象权限(role_tab_privs)
&&&&&&&&&&&&& SQL& SELECT * FROM role_tab_privs WHERE role = 'MANAGER';
&&&&&&&&&&&&& ROLE&&&&&&&&&&&&&&&&&&&&& OWNER&&&&&&&&&&&&&&& TABLE_NAME&&&&&&&&&& COLUMN_NAME PRIVILEGE&&&&&&&&&&& GRA
&&&&&&&&&&&&& ------------------------- -------------------- -------------------- ----------- -------------------- ---
&&&&&&&&&&&&& MANAGER&&&& &&&&&&&&&&&&&&SCOTT&&&&&&&&&&&&&&& EMP&&&&&&&&&&&&&&&&&&&&&&&&&&&&& UPDATE&&&&&&&&&&&&&& NO
&&&&&&&&&&&&& MANAGER&&&&&&&&&&&&&&&&&& SCOTT&&&&&&&&&&&&&&& EMP&&&&&&&&&&&&&&&&&&&&&&&&&&&&& INSERT&&&&&&&&&&&&&& NO
&&&&&&&&&&&&& MANAGER&&&&&&&&&&&&&&&&&& SCOTT&&&&&&&&&&&&&&& EMP
&&&&&& b.取消角色所拥有的权限
&&&&&&&&&& 取消角色拥有的系统权限语法
&&&&&&&&&&&&& REVOKE system_priv | role_name [, system_priv | role_name, ...]
&&&&&&&&&&&&& FROM role | PUBLIC [,role | PUBLIC, ...];
&&&&&&&&&&&&&
&&&&&&&&&& 取消角色用户的对象权限语法
&&&&&&&&&&&&& REVOKE ALL [PRIVILEGES] | object_priv [, object_priv, ...]
&&&&&&&&&&&&& ON [schema_name.]object_name
&&&&&&&&&&&&& FROM role | PUBLIC [,role | PUBLIC, ...]
&&&&&&&&&&&&& [CASCADE CONSTRAINTS]
&&&&&&&&&&
&&&&&&&&&& --取消角色的系统权限
&&&&&&&&&&&&& SQL& REVOKE CREATE VIEW FROM manager;
&&&&&&&&&&&&& Revoked succeeded.&&
&&&&&&&&&&
&&&&&&&&&& --取消角色的对象权限
&&&&&&&&&&&&& SQL& REVOKE INSERT ,UPDATE ON scott.emp FROM manager;
&&&&&&&&&&&&& Revoked succeeded.&&
&&&&&&&&&&
&&&&&&&&&& --查看被取消权限后所剩余的权限的集合
&&&&&&&&&&&&& SQL& SELECT role,'System_privs' owner,privilege
&&&&&&&&&&&&& & 2& FROM role_sys_privs
&&&&&&&&&&&&& & 3& WHERE role = 'MANAGER'
&&&&&&&&&&&&& & 4& UNION&&&&&&&&&&&&&&&&
&&&&&&&&&&&&& & 5& SELECT role,owner,privilege
&&&&&&&&&&&&& & 6& FROM role_tab_privs
&&&&&&&&&&&&& & 7& WHERE role = 'MANAGER';
&&&&&&&&&&&&& ROLE&&&&&&&&&&&&&&&&&&&&&&&&&& OWNER&&&&&&&&&&&&&&& PRIVILEGE
&&&&&&&&&&&&& ------------------------------ -------------------- --------------------
&&&&&&&&&&&&& MANAGER&&&&&&&&&&&&&&&&&&&&&&& SCOTT&&&&&&&&&&&&&&& SELECT
&&&&&&&&&&&&& MANAGER&&&&&&&&&& &&&&&&&&&&&&&System_privs&&&&&&&& CREATE SESSION
&&&&&&&&&&&&& MANAGER&&&&&&&&&&&&&&&&&&&&&&& System_privs&&&&&&&& CREATE TABLE
&&&&&&&&&&
&&& &4.角色赋予与角色取消
&&&&&& a.将角色赋予用户(grant):
&&&&&&&&&& 语法:
&&&&&&&&&&&&& GRANT role_name [, role_name, ...]
&&&&&&&&&&&&& TO user_name | role | PUBLIC [, user_name | role | PUBLIC, ...]
&&&&&&&&&&&&& [WITH ADMIN OPTION];
&&&&&&&&&&
&&&&&&&&&& --将角色赋予robinson且使用了WITH ADMIN OPTION
&&&&&&&&&&&&& SQL& GRANT manager TO robinson WITH ADMIN OPTION;
&&&&&&&&&&&&& Grant succeeded.
&&&&&&&&&& --robinson有权将角色授予john,如下
&&&&&&&&&&&&& SQL& CONN robinson/lion;
&&&&&&&&&&&&& Connected.
&&&&&&&&&&&&& SQL& GRANT manager TO john;
&&&&&&&&&&&&& Grant succeeded.
&&&&&&&&&& --查看角色授予了哪些用户(dba_role_privs)
&&&&&&&&&&&&& SQL& SELECT * FROM dba_role_privs WHERE granted_role = 'MANAGER';
&&&&&&&&&&&&& GRANTEE&&&&&&&&&&&&& GRANTED_ROLE&&&&&&&&&&&&&&&&&& ADM DEF
&&&&&&&&&&&&& -------------------- ------------------------------ --- ---
&&&&&&&&&&&&& SYSTEM&&&&&&&&&&&&&& MANAGER&&&&&&&&&&&&&&&&&&&&&&& YES YES
&&&&&&&&&&&&& JOHN&&&&&&&&&&&&&&&& MANAGER&&&&&&&&&&&&&&&&&&& &&&&NO& YES
&&&&&&&&&&&&& ROBINSON&&&&&&&&&&&& MANAGER&&&&&&&&&&&&&&&&&&&&&&& YES YES
&&&&&&&&&&&&&
&&&&&&&&&& --查看用户拥有哪些角色
&&&&&&&&&&&&& SQL& CONN scott/tiger;
&&&&&&&&&&&&& Connected.
&&&&&&&&&&&&& SQL& SELECT * FROM user_role_privs;
&&&&&&&&&&&&& USERNAME&&&&&&&&&&&&&&&&&&&&&& GRANTED_ROLE&&&&&&&&&&&&&&&&&& ADM DEF OS_
&&&&&&&&&&&&& ------------------------------ ------------------------------ --- --- ---
&&&&&&&&&&&&& SCOTT&&&&&&&&&&&&&&&&&&&&&&&&& CONNECT&&&&&&&&&&&&&&&&&&&&&&& NO& YES NO
&&&&&&&&&&&&& SCOTT&&&&&&&&&&&&&&&&&&&&&&&&& RESOURCE&&&&&&&&&&&&&&&&&&&&&& NO& YES NO
&&&&&&&&&& --查看用户拥有哪些角色(使用session_roles)
&&&&&&&&&&&&& SQL& SELECT * FROM session_roles;
&&&&&&&&&&&&& ROLE
&&&&&&&&&&&&& ------------------------------
&&&&&&&&&&&&& CONNECT
&&&&&&&&&&&&& RESOURCE
&&&&&&&&&&&&&
&&&&&& b.取消用户拥有的角色
&&&&&&&&&& 语法:
&&&&&&&&&&&&& REVOKE role_name [, role_name, ...]
&&&&&&&&&&&&& FROM user_name | role | PUBLIC [, user_name | role | PUBLIC, ...];
&&&&&&&&&&
&&&&&&&&&& --取消用户角色
&&&&&&&&&&&&& SQL& REVOKE resource FROM scott;
&&&&&&&&&&&&& Revoke succeeded.
&&&&&&&&&&
&&&&&&&&&& --查看resource 角色已被取消
&&&&&&&&&&&&& SQL& CONN scott/tiger;&&&&&&&&
&&&&&&&&&&&&& Connected.
&&&&&&&&&&&&& SQL& SELECT * FROM user_role_privs;
&&&&&&&&&&&&& USERNAME&&&&&&&&&&&&&&&&&&&&&& GRANTED_ROLE&&&&&&&&&&&&&&&&&& ADM DEF OS_
&&&&&&&&&&&&& ------------------------------ ------------------------------ --- --- ---
&&&&&&&&&&&&& SCOTT&&&&&&&&&&&&&&&&&&&&&&&&& CONNECT&&&&&&&&&&&&&&&&&&&&&&& NO& YES NO
&&&&&&&&&&
&&&&&&&&&& --对于使用WITH ADMIN OPTION参数,收回robinson角色,并不影响john的级联角色,如下:
&&&&&&&&&&&&& SQL& select * from dba_role_privs where grantee='JOHN';
&&&&&&&&&&&&& GRANTEE&&&&&&&&&&&&& GRANTED_ROLE&&&& &&&&&&&&&&&&&&ADM DEF
&&&&&&&&&&&&& -------------------- ------------------------------ --- ---
&&&&&&&&&&&&& JOHN&&&&&&&&&&&&&&&& MANAGER&&&&&&&&&&&&&&&&&&&&&&& NO& YES
&&&&&&&&&&&&& SQL& revoke manager from robinson;
&&&&&&&&&&&&& Revoke succeeded.
&&&&&&&&&&&&& SQL& select * from dba_role_privs where grantee='JOHN';
&&&&&&&&&&&&& GRANTEE&&&&&&&&&&&&& GRANTED_ROLE&&&&&&&&&&&&&&&&&& ADM DEF
&&&&&&&&&&&&& -------------------- ------------------------------ --- ---
&&&&&&&&&&&&& JOHN&&&&&&&&&&&&&&&& MANAGER&&&&&&&&&&&&&&&&&&&&&&& NO& YES
&&&&&&&&&&&&& SQL& select * from dba_role_privs where grantee='ROBINSON';
&&&&&&&&&&&&& no rows selected
&&&&&&&&&&&&&
&&& 5.设置默认角色
&&&&&& 可以将多个角色授予一个用户。默认角色是这些角色的一个子集,默认角色在用户登录系统时
&&&&&& 自动激活(开启)。在默认情况下,所有赋予用户的角色在用户登录时不需要口令就被激活。
&&&&&& 可以使用ALTER USER语句来限制用户有的默认角色。
&&&&&& 语法:
&&&&&&&&&& ALTER USER username DEFAULT ROLE
&&&&&&&&&& role [, role, ...] | ALL [EXCEPT role [, role, ...]] | NONE;
&&&&&&&&&&
&&&&&& ALTER USER语句中的DEFAULT ROLE子句只适用于那些使用GRANT语句直接授予用户的角色。
&&&&&& DEFAULT ROLE子句在下列情况下是不能使用的:
&&&&&&&&&& 通过其它角色授予的角色
&&&&&&&&&& 没有直接授予该用户的角色
&&&&&&&&&& 通过外部服务(如操作系统)管理的角色
&&&&&& --创建用户martin并授予resource,connect角色
&&&&&&&&&& SQL& CREATE USER martin IDENTIFIED BY
&&&&&& &&& User created.
&&&&&&&&&& SQL& GRANT RESOURCE,CONNECT TO
&&&&&&&&&& Grant succeeded.
&&&&&&&&&& SQL& CONN martin/
&&&&&&&&&& Connected.
&&&&&&&&&& SQL& CONN system/redhat
&&&&&&&&&& Connected.
&&&&&&&&&&
&&&&&& --设置缺省的角色为NONE后,无法登陆
&&&&&&&&&& SQL& ALTER USER martin DEFAULT ROLE NONE;
&&&&&&&&&& User altered.
&&&&&&&&&& SQL& CONN martin/
&&&&&&&&&& ERROR:
&&&&&&&&&& ORA-01045: user MARTIN lacks CREATE SESSION logon denied
&&&&&&&&&& Warning: You are no longer connected to ORACLE.
&&&&&&&&&& SQL& CONN system/
&&&&&&&&&& Connected.
&&&&&&&&&&
&&&&&& --重置角色后可以正常登陆
&&&&&&&&&& SQL& ALTER USER martin DEFAULT ROLE ALL;
&&&&&&&&&& User altered.
&&&&&&&&&& SQL& CONN martin/
&&&&&&&&&& Connected.
&&&&&& --默认角色为除resource之外的所有角色
&&&&&&&&&& SQL& ALTER USER martin DEFAULT ROLE ALL EXCEPT RESOURCE;
&&&&&&&&&& User altered.
&&& 6.激活和禁止角色(SET ROLE)
&&&&&& 语法:
&&&&&&&&&& SET ROLE ALL [EXCEPT role_name [,role_name]] | NONE |
&&&&&&&&&& role_name [IDENTIFIED BY password] [, role_name [IDENTIFIED BY password, ...];
&&&&&& SQL& CONN robinson/lion
&&&&&& Connected.
&&&&&& --查看用户拥有的所有角色
&&&&&&&&&& SQL& SELECT * FROM user_role_privs;
&&&&&&&&&& USERNAME&&&&&&&&&&&&&&&&&&&&&& GRANTED_ROLE&&&&&&&&&&&&&&&&&& ADM DEF OS_
&&&&&&&&&& ------------------------------ ------------------------------ --- --- ---
&&&&&&&&&& ROBINSON&&&&&&&&&&&&&&&&&&&&&& MANAGER&&&&&&&&&&&&&&&&&&&&&&& NO& YES NO
&&&&&&&&&& ROBINSON&&&&&&&&&&&&&&&&&&&&&& RESOURCE&&&&&&&&&&&&&&&&&&&&&& NO& YES NO
&&&&&& --查看用户拥有的所有权限
&&&&&&&&&& SQL& SELECT * FROM session_privs;
&&&&&&&&&& PRIVILEGE
&&&&&&&&&& ----------------------------------------
&&&&&&&&&& CREATE SESSION
&&&&&&&&&& CREATE TABLE
&&&&&&&&&& CREATE CLUSTER
&&&&&&&&&& CREATE SEQUENCE
&&&&&&&&&& CREATE PROCEDURE
&&&&&&&&&& CREATE TRIGGER
&&&&&&&&&& CREATE TYPE
&&&&&&&&&& CREATE OPERATOR
&&&&&&&&&& CREATE INDEXTYPE
&&&&&&&&&& 9 rows selected.
&&&&&& --禁用所有的角色后,用户的权限无显示记录
&&&&&&&&&& SQL& SET ROLE NONE;
&&&&&&&&&& Role set.
&&&&&&&&&& SQL& SELECT * FROM session_privs;
&&&&&&&&&& no rows selected
&&&&&& --用户重新启用所有角色
&&&&&&&&&& SQL& SET ROLE ALL&&
&&&&&&&&&& Role set.
&&&&&& --启用一个manager角色
&&&&&&&&&& SQL& SET ROLE manager;
&&&&&&&&&& Role set.
&&&&&&&&&& SQL& SELECT * FROM session_roles;
&&&&&&&&&& ROLE
&&&&&&&&&& ------------------------------
&&&&&&&&&& MANAGER
&&&&&& 在这里不象一般的ALTER 命令,没有用到ENABLE 和DISABLE 之类的选项。
&&& 7.角色删除:
&&&&&&&&&& DROP ROLE role_name
&&&&&& --角色的删除需要适当的权限,如下提示没有权限删除角色&&&&&
&&&&&&&&&& SQL& SHOW USER;
&&&&&&&&&& USER is "ROBINSON"
&&&&&&&&&& SQL& DROP ROLE manager;
&&&&&&&&&& DROP ROLE manager
&&&&&&&&&& *
&&&&&&&&&& ERROR at line 1:
&&&&&&&&&& ORA-01031: insufficient privileges
&&&&&& --使用system帐户删除角色
&&&&&&&&&& SQL& CONN system/redhat;
&&&&&&&&&& Connected.
&&&&&&&&&& SQL& DROP ROLE manager;
&&&&&& --帐户robisnon唯一的角色被删除后,再次使用该帐户登陆已提示没有权限
&&&&&& --即角色的删除,原来所关联的用户会自动分离该角色及所有相关权限
&&&&&&&&&& SQL& CONN robinson/lion;
&&&&&&&&&& ERROR:
&&&&&&&&&& ORA-01045: user ROBINSON lacks CREATE SESSION privilege; logon denied
&&&&&&&&&& Warning: You are no longer connected to ORACLE.
&&&&&&&&&& Role dropped.
&&&&&& 关于connect和resource预定义角色:
&&&&&&&&&& connect, resoure 是role,包含很多的权限的
&&&&&&&&&& 其中resource具有创建表,索引,视图和其他的Oracle对象的能力,
&&&&&&&&&& 同时默认带有unlimited tablespace权限
&&&&&&&&&& 一般将connect授予所有的普通用户
&&&&&&&&&& connect和resource授予开发人员
&&&&&&&&&& oracle声称connect和resource角色是为了与它早期的版兼容而保留的,
&&&&&&&&&& 劝告用户尽可能不要使用这两个角色,以避免产生安全漏洞。
二、用户配置文件
&&& 配置文件实现中几类安全控制措施:
&&&&&& 帐户上锁
&&&&&& 资源限制
&&&&&& 直接权限
&&&&&& 角色权限
&&& 1.资源限制:
&&&&&& 利用配置文件来实现,可用以下两种方法之一来开启资源限制:
&&&&&&&&&& a.在初始化参数文件中将RESOURCE_LIMIT 设为TRUE
&&&&&&&&&& b.使用ALTER SYSTEM 命令将RESOURCE_LIMIT 设为TRUE
&&&&&&&&&&&&& ALTER SYSTEM SET RESOURCE_LIMIT=TRUE;
&&&&&& 配置文件的资源限制既可加在会话一级,也可加在调用一级,会话级设置的资源限制是强加在每一个
&&&&&& 连接上的。当超过了会话级的资源限制时,ORACLE系统将返回出错信息。服务器与用户的连接断开
&&&&&& 在会话级可以设置的资源限制如下:
&&&&&&&&&& SESSION_PER_USER: &&&&&&&& 每个用户所允许的并行会话数
&&&&&&&&&& CPU_PER_SESSION:& &&&&&&&& 总共的CPU时间,其单位是%s
&&&&&&&&&& IDLE_TIME:&&& &&&&&&&&&&&& 没有活动的时间,单位是分钟
&&&&&&&&&& CONNECT_TIME: &&&&&&&&&&&& 连接时间
&&&&&&&&&& LOGICAL_READS_PER_SESSION:& 物理和逻辑读的数据块数。
&&&&&& 创建资源限制文件:
&&& &&&&&& CREATE PROFILE profile_name LIMIT
&&&&&&&&&&&&& [SESSION_PER_USER max_value]
&&&&&&&&&&&&& [CPU_PER_SESSION max_value]
&&&&&&&&&&&&& [CPU_PER_CALL max_value]
&&&&&&&&&&&&& [CONNECT_TIME max_value]
&&&&&&&&&&&&& [IDLE_TIME max_value]
&&&&&&&&&&&&& [LOGICAL_READS_PER_SESSION max_value]
&&&&&&&&&&&&& [LOGICAL_READS_PER_CALL max_value]
&&&&&& --演示创建资源限制配置文件
&&&&&&&&&& SQL& CREATE PROFILE luckly_prof LIMIT
&&&&&&&&&&&&& 2& SESSIONS_PER_USER 8&&&&&&&&&&&&&&&&& --同一用户可打开个会话(连接)
&&&&&&&&&&&&& 3& CPU_PER_SESSION 168000&&&&&&&&&&&&&& --每个会话最多可以使用的CPU时间为个%s
&&&&&&&&&&&&& 4& LOGICAL_READS_PER_SESSION 21888&&&&& --每个会话最多可以读个数据块
&&&&&&&&&&&&& 5& CONNECT_TIME 180&&&&&&&&&&&&&&&&&&&& --每个会话的连接时间最多为分钟
&&&&&&&&&&&&& 6& IDLE_TIME 10 ;&&&&&&&&&&&&&&&&&&&&&& --每个会话的没有活动时间不能超分钟
&&&&&&&&&& Profile created.
&&&&&& --查看刚刚创建的配置文件
&&&&&&&&&& SQL& SELECT * FROM dba_profiles WHERE profile = 'LUCKLY_PROF';
&&&&&&&&&& PROFILE&&&&&&&&&&&&& &&&&&&&&&&RESOURCE_NAME&&&&&&&&&&&&&&&&&&& RESOURCE LIMIT
&&&&&&&&&& ------------------------------ -------------------------------- -------- -----------------------
&&&&&&&&&& LUCKLY_PROF&&&&&&&&&&&&&&&&&&& COMPOSITE_LIMIT&&&&&&&&&&&&&&&&& KERNEL&& DEFAULT
&&&&&&&&&& LUCKLY_PROF&&&&&&&&&&&&&&&&&&& SESSIONS_PER_USER&&&&&&&&&&&&&&& KERNEL&& 8
&&&&&&&&&& LUCKLY_PROF&&&&&&&&&&&&&&&&&&& CPU_PER_SESSION&&&&&&&&&&&&&&&&& KERNEL&& 168000
&&&&&&&&&& LUCKLY_PROF&&&&&&&&&&&&&&&&&&& CPU_PER_CALL&&&&&&&&&&&&&&&&&&&& KERNEL&& DEFAULT
&&&&&&&&&& LUCKLY_PROF&&&&&&&&&& &&&&&&&&&LOGICAL_READS_PER_SESSION&&&&&&& KERNEL&& 21888
&&&&&&&&&& LUCKLY_PROF&&&&&&&&&&&&&&&&&&& LOGICAL_READS_PER_CALL&&&&&&&&&& KERNEL&& DEFAULT
&&&&&&&&&& LUCKLY_PROF&&&&&&&&&&&&&&&&&&& IDLE_TIME&&&&&&&&&&&&&&&&&&&&&&& KERNEL&& 10
&&&&&&&&&& LUCKLY_PROF&&&&&&&&&&&&&&&&&&& CONNECT_TIME&&&&&&&&&&&&&&&&&&&& KERNEL&& 180
&&&&&&&&&& LUCKLY_PROF&&&&&&&&&&&&&&&&&&& PRIVATE_SGA&&&&&&&&&&&&&&&&&&&&& KERNEL&& DEFAULT
&&&&&&&&&& LUCKLY_PROF&&&&&&&&&&&&&&&&&&& FAILED_LOGIN_ATTEMPTS&&&&&&&&&&& PASSWORD DEFAULT
&&&&&&&&&& LUCKLY_PROF&&&&&&&&&&&&&&&&&&& PASSWORD_LIFE_TIME&&&&&&&&&&&&&& PASSWORD DEFAULT
&&&&&&&&&& PROFILE&&&&&&&&&&&&&&&&&&&&&&& RESOURCE_NAME&&&&&&&&&&&&&&&&&&& RESOURCE LIMIT
&&&&&&&&&& ------------------------------ -------------------------------- -------- ------------------------
&&&&&&&&&& LUCKLY_PROF&&&&&&&&&&&&&&&&& &&PASSWORD_REUSE_TIME&&&&&&&&&&&&& PASSWORD DEFAULT
&&&&&&&&&& LUCKLY_PROF&&&&&&&&&&&&&&&&&&& PASSWORD_REUSE_MAX&&&&&&&&&&&&&& PASSWORD DEFAULT
&&&&&&&&&& LUCKLY_PROF&&&&&&&&&&&&&&&&&&& PASSWORD_VERIFY_FUNCTION&&&&&&&& PASSWORD DEFAULT
&&&&&&&&&& LUCKLY_PROF&&&&&&&&&&&&&&&&&&& PASSWORD_LOCK_TIME&&&&&&&&&&&&&& PASSWORD DEFAULT
&&&&&&&&&& LUCKLY_PROF&&&&&&&&&&&&&&&&&&& PASSWORD_GRACE_TIME&&&&&&&&&&&&& PASSWORD DEFAULT
&&& 2.口令限制
&&&&&& FAILED_LOGIN_ATTEMPTS && 帐户被锁之前可以尝试登录失败的次数
&&&&&& PASSWORD_LOCK_TIME &&&&& 尝试指定次数失败后,账户被锁的天数
&&&&&& PASSWORD_LIFE_TIME &&&&& 口令的生命周期(可使用的天数)
&&&&&& PASSWORD_GRACE_TIME&& && 口令过期之后第一次成功地使用原口令登录后要改变口令的宽限天数
&&&&&& PASSWORD_REUSE_TIME 在一个口令可以重用之前的天数
&&&&&& PASSWORD_REUSE_MAX &&&&& 在一个口令可以重用之前的最大变化数
&&&&&& PASSWORD_VERIFY_FUNCTION && 在一个新的口令赋予一个用户之前,要验证口令的复杂性是否满足
&&&&&&&&&&&&&&&&&&&& 安全要求的一个PL/SQL函数(该函数要sys用户运行utlpwdmg.sql
&&&&&&&&&&&&& &&&&&& 脚本来生成)
&&&&&& 在执行utlpwdmg.sql脚本文件期间,ORACLE服务器将创建VERIFY_FUNCTION函数,并且使用如下
&&&&&& 的ALTER PROFILE 命令来修改luckly_prof概要文件:
&&&&&& --为luckly_prof配置文件增加口令限制
&&&&&&&&&& SQL& ALTER PROFILE luckly_prof LIMIT
&&&&&&&&&& 2& PASSWORD_LIFE_TIME 60
&&&&&&&&&& 3& PASSWORD_GRACE_TIME 10
&&&&&&&&&& 4& PASSWORD_REUSE_TIME 1800
&&&&&&&&&& 5& PASSWORD_REUSE_MAX UNLIMITED
&&&&&&&&&& 6& FAILED_LOGIN_ATTEMPTS 3
&&&&&&&&&& 7& PASSWORD_LOCK_TIME 1/1440;
&&&&&&&&&& Profile altered.
&&&&&& 之后,ORACLE服务器就要对所有用户提供的口令进行如下检查:
&&&&&&&&&& 口令的最小长度为个字符
&&&&&&&&&& 口令不应该与用户名相同
&&&&&&&&&& 口令应该包含至少一个字符、一个数字和一个特殊字符
&&&&&&&&&& 口令应该至少有个字母与以前的口令不同。除了ORACLE提供的默认复杂性检验函数外,
&&&&&& 数据库管理员也可以自己写一个PL/SQL函数进行口令的复杂性检验。
&&&&&& 用户提供的口令函数一定要在SYS模式下创建并且必须使用以下函数说明(即函数接口)
&&&&&&&&&& function_name (userid_parameter IN VARCHAR2(30),
&&&&&&&&&&&&&&&&& password_parmeter IN VARCHAR2(30),
&&&&&&&&&&&&&&&&& old_password_parmeter IN VARCHAR2(30)
&&&&&&&&&&&&&&&&& RETURN BOOLEAN
&&&&&& 创建口令限制的概要文件:
&&&&&&&&&& 同创建资源限制文件一样,只要把口令限制方面的内容加到profile_name中即可。
&&&&&&&&&& 如:
&&&&&&&&&& CREATE PROFILE unluck_prof LIMIT
&&&&&&&&&& FAILED_LOGIN_ATTEMPTS 7
&&&&&&&&&& PASSWORD_LOCK_TIME UNLIMITED
&&&&&&&&&& PASSWORD_LIFE_TIME 44
&&&&&&&&&& PASSWORD_REUSE_TIME 24
&&&&&&&&&& PASSWORD_GRACE_TIME 4;
&&&&&& --查看资源限制(dba_profiles):
&&&&&&&&&& SQL& SELECT * FROM dba_profiles WHERE profile = 'LUCKLY_PROF';
&&&&&&&&&& PROFILE&&&&&&&&&&&&&&&&&&&&&&& RESOURCE_NAME&&&&&&&&&&&&&&&&&&& RESOURCE LIMIT
&&&&&&&&&& ------------------------------ -------------------------------- -------- ----------------------
&&&&&&&&&& LUCKLY_PROF&&&&&&&&&&&&&&&&&&& COMPOSITE_LIMIT&&&&&&&&&&&&&&&&& KERNEL&& DEFAULT
&&&&&&&&&& LUCKLY_PROF&&&&&&&&&&&&&&&&&&& SESSIONS_PER_USER&&&&&&&&&&&&&&& KERNEL&& 8
&&&&&&&&&& LUCKLY_PROF&&&&&&&&&&&&&&&&&&& CPU_PER_SESSION&&&&&&&&&&&&&&&&& KERNEL&& 168000
&&&&&&&&&& LUCKLY_PROF&&&&&&&&&&&&&&&&&&& CPU_PER_CALL&&&&&&&&&&&&&&&&&&&& KERNEL&& DEFAULT
&&&&&&&&&& LUCKLY_PROF&&&&&&&&&&&&&&&&&&& LOGICAL_READS_PER_SESSION&&&&&&& KERNEL&& 21888
&&&&&&&&&& LUCKLY_PROF&&&&&&&&&&&&&&&&&&& LOGICAL_READS_PER_CALL&&&&&&&&&& KERNEL&& DEFAULT
&&&&&&&&&& LUCKLY_PROF&&&&& &&&&&&&&&&&&&&IDLE_TIME&&&&&&&&&&&&&&&&&&&&&&& KERNEL&& 10
&&&&&&&&&& LUCKLY_PROF&&&&&&&&&&&&&&&&&&& CONNECT_TIME&&&&&&&&&&&&&&&&&&&& KERNEL&& 180
&&&&&&&&&& LUCKLY_PROF&&&&&&&&&&&&&&&&&&& PRIVATE_SGA&&&&&&&&&&&&&&&&&&&&& KERNEL&& DEFAULT
&&&&&&&&&& LUCKLY_PROF&&&&&&&&&&&&&&&&&& &FAILED_LOGIN_ATTEMPTS&&&&&&&&&&& PASSWORD 3
&&&&&&&&&& LUCKLY_PROF&&&&&&&&&&&&&&&&&&& PASSWORD_LIFE_TIME&&&&&&&&&&&&&& PASSWORD 60
&&&&&&&&&& PROFILE&&&&&&&&&&&&&&&&&&&&&&& RESOURCE_NAME&&&&&&&&&&&&&&&&&&& RESOURCE LIMIT
&&&&&&&&&& ------------------------------ -------------------------------- -------- -----------------------
&&&&&&&&&& LUCKLY_PROF&&&&&&&&&&&&&&&&&&& PASSWORD_REUSE_TIME&&&&&&&&&&&&& PASSWORD 1800
&&&&&&&&&& LUCKLY_PROF&&&&&&&&&&&&&&&&&&& PASSWORD_REUSE_MAX&&&&&&&&&&&&&& PASSWORD UNLIMITED
&&&&&&&&&& LUCKLY_PROF&&&&&&&&&&&&&&&&&&& PASSWORD_VERIFY_FUNCTION&&&&&&&& PASSWORD DEFAULT
&&&&&&&&&& LUCKLY_PROF&&&&&&&&&&&&&&&&&&& PASSWORD_LOCK_TIME&&&&&&&&&&&&&& PASSWORD .0006
&&&&&&&&&& LUCKLY_PROF&&&&&&&&&&&&&&&&&&& PASSWORD_GRACE_TIME&&&&&&&&&&&&& PASSWORD 10
&&&&&&&&&& 16 rows selected.&&&&&&&
&&&&&&&&&& RESOURCE_TYPE为KERNEL表示这是一个资源限制,为PASSWORD表示为口令限制。
&&& 3.修改配置文件:
&&&&&& ALTER PROFILE profile_name LIMIT
&&&&&&&&&& ......
&&&&&& 例:ALTER PROFILE luck_prof LIMIT
&&&&&&&&&& IDLE_TIME 40
&&& 4.将PROFILE赋予用户:
&&&&&& CREATE USER user_name [PROFILE { profile_name | DEFAULT }]
&&&&&& ALTER USER user_name [PROFILE { profile_name | DEFAULT }]
&&&&&& 请参照:&&&&&&&&
&&&&&& SQL& CREATE USER andy IDENTIFIED BY oracle PROFILE luckly_prof;
&&&&&& User created.
&&&&&& SQL& ALTER USER robinson PROFILE luckly_prof;
&&&&&& User altered.&&&&
&&& 5.删除配置文件:
&&&&&& DROP PROFILE profile_name [CASCADE]
&&&&&& 如果一个概要文件已经赋予了用户,那么在DROP PROFILE时要用CASCADE
&&&&&& 无法删除DEFAULT配置文件,也无法删除MONITORING_PROFILE配置文件
&&&&&& --已被赋予给用的profile删除时需要使用cascade,如下:
&&&&&&&&&& SQL& DROP PROFILE luckly_prof;
&&&&&&&&&& DROP PROFILE luckly_prof
&&&&&&&&&& *
&&&&&&&&&& ERROR at line 1:
&&&&&&&&&& ORA-02382: profile LUCKLY_PROF has users assigned, cannot drop without CASCADE
&&&&&&&&&& SQL& DROP PROFILE luckly_prof CASCADE;
&&&&&&&&&& Profile dropped.
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:4722183次
积分:48492
积分:48492
排名:第61名
原创:601篇
评论:701条
十年以上数据库运维管理,性能优化经验
提供数据库相关技术支持及数据库培训
&全部文章,欢迎扩散,转载请注明出处
DBA交流群:
(3)(6)(3)(7)(5)(4)(1)(8)(2)(11)(9)(1)(5)(1)(6)(5)(2)(2)(1)(4)(8)(11)(3)(4)(1)(5)(14)(3)(7)(6)(16)(4)(19)(11)(4)(4)(4)(7)(10)(3)(4)(5)(5)(8)(7)(11)(13)(13)(9)(13)(14)(15)(9)(7)(18)(9)(12)(7)(4)(1)(1)(7)(7)(8)(2)(6)(4)(8)(9)(3)(3)(9)(6)(7)(2)(4)(6)(8)(20)(11)(7)(2)(7)(12)(5)(10)(10)(6)(2)(1)(3)(3)

我要回帖

更多关于 一个人玩的魔兽rpg 的文章

 

随机推荐