open.locked,expired,EXPIRED(GRACE) ,LOCKED(TIMED) 数据库用户的几个状态

本文介绍Oracle数据库中如何通过设置不同的用户状态(如open、expired、locked等),来实现对用户登录及密码的有效管理。文中详细解释了这些状态的含义及其应用场景,并通过实际操作演示了如何更改用户状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. open 当前用户是开放的可以使用的.
SQL> select username,account_status from dba_users where username = 'TONGJW';

USERNAME                       ACCOUNT_STATUS
------------------------------ --------------------------------
TONGJW                         OPEN

SQL> conn tongjw
Enter password: *******
Connected.

2. expired 表示用户已经过期, 登录的时候, 如果密码输入正确,系统会提示重新输入密码的.

SQL> conn jfdata/jf
Connected.
SQL> alter user tongjw account unlock;

User altered.

SQL> alter user tongjw password expire;

User altered.

SQL> conn tongjw
Enter password: *******
ERROR:
ORA-28001: the password has expired


Changing password for tongjw
New password: *******
Retype new password: *******
Password changed
Connected.


3. locked 表明当前帐户被锁了, 不可以登录的.

SQL> conn jfdata/jf
Connected.
SQL> alter user tongjw account lock;

User altered.

SQL> conn tongjw
Enter password: *******
ERROR:
ORA-28000: the account is locked


Warning: You are no longer connected to ORACLE.

expired (grace)  与 locked (timed) 是有系统的profile来进行控制的.

4. expired (grace) 指定一个期限, 到达这个期限的时候,系统会给出一个警告并且允许登录(grace), 如果过了这段期限, 对应的密码就会自动过期, 相当于我们的密码过期提醒.
PASSWORD_GRACE_TIME
PASSWORD_LIFE_TIME
Specify the number of days after the grace period begins during which a warning is issued and login is allowed. If the password is not changed during the grace period, the password expires.

SQL> select username,account_status,profile from dba_users where username = 'TONGJW';

USERNAME                       ACCOUNT_STATUS                   PROFILE
------------------------------ -------------------------------- ------------------------------
TONGJW                         OPEN                             DEFAULT

SQL> create profile test limit
  2    password_life_time 5 password_grace_time 5;

Profile created.

SQL> alter user tongjw profile test;

User altered.

SQL> select username,account_status,profile from dba_users where username = 'TONGJW';

USERNAME                       ACCOUNT_STATUS                   PROFILE
------------------------------ -------------------------------- ------------------------------
TONGJW                         OPEN                             TEST

SQL> conn tongjw/playboy
Connected.
SQL> /

这是我们修改系统时间, 将日期往后修改几天

[oracle@TzDbTzcenter2 ]$ su
Password:
[root@TzDbTzcenter2 ]# date
Tue Mar 22 18:42:26 CST 2005
[root@TzDbTzcenter2 ]# date '03281842'
Mon Mar 28 18:42:00 CST 2005
[root@TzDbTzcenter2 ]# exit
[oracle@TzDbTzcenter2 ]$ sqlplus tongjw/tongjw

SQL*Plus: Release 9.2.0.4.0 - Production on Mon Mar 28 18:42:01 2005

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.

ERROR:
ORA-28002: the password will expire within 5 days



Connected to:
Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.4.0 - Production

SQL> conn jfdata/jf
Connected.
SQL> select username,account_status,profile from dba_users where username = 'TONGJW';

USERNAME                       ACCOUNT_STATUS                   PROFILE
------------------------------ -------------------------------- ------------------------------
TONGJW                         EXPIRED(GRACE)                   TEST

SQL>

再将日期向后修改几天, 我们可以看到此时用户的状态已经改为Expired

[oracle@TzDbTzcenter2 ]$ sqlplus tongjw/tongjw

SQL*Plus: Release 9.2.0.4.0 - Production on Tue Apr 5 18:44:02 2005

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.

ERROR:
ORA-28001: the password has expired


Changing password for tongjw
New password:
Retype new password:
ERROR:
ORA-00988: missing or invalid password(s)


Password unchanged
Enter user-name: jfdata/jf

Connected to:
Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.4.0 - Production

SQL> select username,account_status,profile from dba_users where username = 'TONGJW';

USERNAME                       ACCOUNT_STATUS                   PROFILE
------------------------------ -------------------------------- ------------------------------
TONGJW                         EXPIRED                          TEST



5. locked(timed)
PASSWORD_LOCK_TIME
Specify the number of days an account will be locked after the specified number of consecutive failed login attempts.
FAILED_LOGIN_ATTEMPTS
Specify the number of failed attempts to log in to the user account before the account is locked.

设定相关的profile属性^_^.

SQL> alter user tongjw profile default;

User altered.

SQL> drop profile test;

Profile dropped.

SQL> create profile test limit
  2    password_lock_time 5 failed_login_attempts 3;

Profile created.

SQL> alter user tongjw profile test;

User altered.

修改系统的时间信息.

[root@TzDbTzcenter2 ]# date
Tue Mar 22 18:55:42 CST 2005
[root@TzDbTzcenter2 ]# date '03281855'
Mon Mar 28 18:55:00 CST 2005
[root@TzDbTzcenter2 ]# exit
[oracle@TzDbTzcenter2 ]$ sqlplus jfdata/jf

SQL*Plus: Release 9.2.0.4.0 - Production on Mon Mar 28 18:55:02 2005

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.


Connected to:
Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.4.0 - Production

SQL> conn tongjw/tongjw
Connected.
SQL> conn tongjw/tongj1
ERROR:
ORA-01017: invalid username/password; logon denied


Warning: You are no longer connected to ORACLE.
SQL> conn tongjw/tongj2
ERROR:
ORA-01017: invalid username/password; logon denied


SQL> conn tongjw/tongj3
ERROR:
ORA-01017: invalid username/password; logon denied


SQL> conn tongjw/tongj4
ERROR:
ORA-28000: the account is locked


SQL> conn tongjw/tongjw
ERROR:
ORA-28000: the account is locked




SQL> conn jfdata/jf
Connected.
SQL> select username,account_status,profile from dba_users where username = 'TONGJW';

USERNAME                       ACCOUNT_STATUS                   PROFILE
------------------------------ -------------------------------- ------------------------------
TONGJW                         LOCKED(TIMED)                    TEST

<think>我们正在讨论Unity中的鼠标锁定问题。用户希望在鼠标被锁定时(CursorLockMode.Locked)仍然能够检测到OnPointerDown事件(即鼠标点击事件)并进行相应的点击操作。 根据Unity的常规行为,当使用CursorLockMode.Locked时,鼠标会被隐藏并锁定在屏幕中央,此时常规的鼠标移动事件不会产生位移(因为被锁定了),但是鼠标的按钮事件(如按下、抬起)仍然会触发。 在Unity中,UI元素(如Button)的点击事件是通过EventSystem来处理的。EventSystem依赖于鼠标(或触摸)的位置。当鼠标被锁定时,鼠标的位置被固定在屏幕中心,并且不会移动。但是,这并不妨碍EventSystem检测鼠标按键。 关键在于:即使鼠标位置被锁定,只要鼠标按键被按下,Unity仍然会触发相应的鼠标事件。因此,对于UI元素,只要鼠标指针(虽然不可见)位于该UI元素上,就可以触发OnPointerDown等事件。 然而,问题在于:当鼠标被锁定时,我们无法移动鼠标,因此鼠标指针始终停留在屏幕中心。如果我们需要点击的UI元素不在屏幕中心,那么鼠标指针就不会位于该UI元素上,从而无法触发事件。 因此,用户的需求实际上包含两个部分: 1. 在鼠标锁定状态下,能够触发OnPointerDown事件。 2. 同时,希望鼠标锁定不被释放(即不将CursorLockMode改为None或Confined)。 解决方案: 首先,我们确认:在锁定状态下,如果UI元素位于屏幕中心(即鼠标指针所在位置),那么点击鼠标按钮是可以触发该UI元素的OnPointerDown事件的。 但是,如果UI元素不在屏幕中心,我们就无法通过移动鼠标去点击它。因此,我们需要设计一种方式,使得不需要移动鼠标就能“点击”到UI元素。 一种常见的做法是:使用射线检测(Raycast)来模拟点击。我们可以通过发射一条从屏幕中心(即鼠标锁定时的位置)发出的射线,检测射线击中的UI元素,然后模拟点击事件。 具体步骤: 1. 在鼠标锁定状态下,当用户按下鼠标按钮时,我们可以通过代码检测屏幕中心位置下的UI元素。 2. 如果检测到UI元素,则手动调用该UI元素上的IPointerDownHandler接口方法。 另一种做法是:在鼠标锁定状态下,我们仍然可以使用Unity的EventSystem的当前模块(如StandaloneInputModule)来处理点击事件,但是需要确保EventSystem能够接收来自屏幕中心位置的点击。 实际上,StandaloneInputModule在每一帧都会检测鼠标位置(即屏幕中心)下的UI元素,并处理鼠标事件。因此,只要UI元素位于屏幕中心,就可以被点击到。 所以,如果我们的UI元素可以出现在屏幕中心(例如,一个在屏幕中心的大按钮或者一个十字准星),那么就可以直接使用。 但是,如果用户需要点击的UI元素不在屏幕中心,那么我们就需要修改EventSystem的输入模块,使其能够处理不在屏幕中心的UI元素。这通常不是直接可行的,因为鼠标位置被固定了。 因此,我们可能需要设计一个替代的输入系统,例如: - 使用键盘选择UI元素(如通过方向键或数字键)。 - 或者使用游戏手柄。 然而,用户的需求是使用鼠标点击,而且是在鼠标锁定的情况下。所以,我们只能点击屏幕中心位置的UI元素。 结论: 在Unity中,当鼠标被锁定时(CursorLockMode.Locked),鼠标位置被固定在屏幕中心,并且不可见。此时,EventSystem仍然会处理鼠标按键事件,但只能作用于屏幕中心位置下的UI元素。 因此,如果需要在鼠标锁定时处理点击事件,可以将需要点击的UI元素放置在屏幕中心(或者使用一个覆盖全屏的透明面板,然后在屏幕中心放置一个按钮),这样当用户点击时,就可以触发该UI元素的事件。 示例代码: 假设我们有一个位于屏幕中心的按钮,我们可以这样处理: 1. 在Canvas上创建一个按钮,将其放置在屏幕中心(可以使用锚点设置为居中)。 2. 为按钮添加点击事件处理函数。 同时,在鼠标锁定状态下,我们仍然可以捕获鼠标按下事件: 在Update函数中,我们可以检测鼠标按键,然后模拟点击屏幕中心的UI元素(如果存在)。 但是,更简单的方式是直接依赖Unity的EventSystem,因为EventSystem在鼠标锁定时仍然会向屏幕中心的UI元素发送事件。 因此,我们不需要额外的代码来处理点击,只需要确保UI元素在屏幕中心即可。 但是,如果用户希望点击不在屏幕中心的UI元素,那么就需要在鼠标锁定状态下暂时释放鼠标锁定(例如,按下某个键时释放,然后移动鼠标点击,再重新锁定)。这可能会破坏沉浸感。 所以,对于游戏中的常见做法(如射击游戏中的开火按钮),通常会将开火按钮设计在屏幕的固定位置(如右下角),但在鼠标锁定时,玩家无法点击它。因此,这类游戏通常使用两种方式之一: 1. 使用键盘按键(如空格键、鼠标左键)来触发开火,而不是通过UI按钮。 2. 在需要点击UI时,临时释放鼠标锁定(如按Tab键打开背包时,释放鼠标锁定,如引用[2]中的做法)。 根据引用[2]中的代码,当按下Tab键时,显示背包界面并将鼠标锁定模式改为CursorLockMode.Confined(限制在窗口内),这样玩家就可以移动鼠标点击背包中的物品。再次按下Tab键,隐藏背包并重新锁定鼠标。 所以,如果用户需要在鼠标锁定的情况下进行点击操作,且点击的UI元素不在屏幕中心,那么可能需要临时切换鼠标锁定状态。 如果用户坚持不释放鼠标锁定,那么只能通过其他输入方式(如键盘)来模拟点击。 总结回答: 在Unity中,当使用CursorLockMode.Locked锁定鼠标时,鼠标位置被固定在屏幕中央且不可见。此时,Unity的EventSystem仍然会处理鼠标事件,但只能触发位于屏幕中央的UI元素(如按钮)的OnPointerDown事件。 因此,如果需要在锁定状态下处理点击事件,请将需要点击的UI元素放置在屏幕中央。例如,可以设计一个位于屏幕中央的透明按钮,或者一个十字准星作为按钮。 如果必须点击不在屏幕中央的UI元素,则需要在点击操作时临时释放鼠标锁定(例如,切换到CursorLockMode.None或Confined),让用户移动鼠标进行点击,完成后再重新锁定。这种方式常见于游戏中的菜单打开(如引用[2]的做法)。 示例代码(临时释放鼠标锁定): ```csharp void Update() { if (Input.GetKeyDown(KeyCode.E)) { // 假设按下E键打开某个菜单 OpenMenu(); } } void OpenMenu() { // 显示菜单 menu.SetActive(true); // 释放鼠标锁定,让鼠标可以移动 Cursor.lockState = CursorLockMode.None; // 显示鼠标光标 Cursor.visible = true; } // 关闭菜单时 void CloseMenu() { menu.SetActive(false); // 重新锁定鼠标 Cursor.lockState = CursorLockMode.Locked; // 隐藏光标(在锁定模式下自动隐藏,但也可以显式设置) Cursor.visible = false; } ``` 注意:Cursor.visible属性用于控制光标的可见性。在锁定模式下,光标默认不可见,但解除锁定时需要显式设置可见性。 如果用户希望不释放鼠标锁定且点击非中心UI元素,则没有内置的解决方案,需要设计替代输入方式。 因此,根据用户的需求,我们推荐将需要点击的UI元素放在屏幕中心,或者采用临时释放鼠标锁定的方式。 相关问题: 1. 如何在Unity中实现一个不释放鼠标锁定就能操作的屏幕中心菜单? 2. 在Unity中,CursorLockMode.Locked和CursorLockMode.Confined有什么区别? 3. 如何用键盘控制UI元素的选中和点击(在鼠标锁定的情况下)?</think>在 Unity 中,当使用 `CursorLockMode.Locked` 锁定鼠标时,鼠标会被隐藏并固定在屏幕中央,但您仍然可以通过以下方法处理 `OnPointerDown` 事件: ### 解决方案 1. **使用 `EventSystem` 的射线检测** 即使鼠标被锁定,Unity 的 `EventSystem` 仍会持续检测屏幕中心点(即鼠标锁定位置)的 UI 交互: ```csharp using UnityEngine; using UnityEngine.EventSystems; public class LockedClickHandler : MonoBehaviour, IPointerDownHandler { public void OnPointerDown(PointerEventData eventData) { // 在鼠标锁定状态下仍会被触发 Debug.Log("点击事件触发,鼠标锁定中"); // 添加点击逻辑(如射击、选择物品等) } } ``` 将此脚本附加到需要响应点击的 UI 元素(如 Image 或 Button)上。 2. **确保 UI 元素位于屏幕中心** 由于鼠标被锁定在屏幕中心,需要点击的 UI 元素(如准星、中心按钮等)必须**锚定在屏幕中心**: ```csharp // 在UI初始化时设置位置 void Start() { RectTransform rect = GetComponent<RectTransform>(); rect.anchorMin = new Vector2(0.5f, 0.5f); rect.anchorMax = new Vector2(0.5f, 0.5f); rect.anchoredPosition = Vector2.zero; // 居中 } ``` 3. **组合使用物理射线检测(3D/2D 对象)** 对于非 UI 的游戏对象: ```csharp void Update() { if (Input.GetMouseButtonDown(0)) { Ray ray = Camera.main.ScreenPointToRay(new Vector3(Screen.width/2, Screen.height/2, 0)); RaycastHit hit; if (Physics.Raycast(ray, out hit)) { hit.collider.SendMessage("OnPointerDown", SendMessageOptions.DontRequireReceiver); } } } ``` ### 关键配置 - **光标设置**:保持锁定状态且隐藏光标 ```csharp Cursor.lockState = CursorLockMode.Locked; Cursor.visible = false; // 确保隐藏 ``` - **EventSystem 配置**:场景中必须有 `EventSystem` 对象(通常由 Unity UI 自动创建)。 ### 注意事项 1. **仅中心点可交互**:所有点击检测仅发生在屏幕中心点,UI 元素必须覆盖该点。 2. **无鼠标移动事件**:`OnPointerMove` 在锁定状态下不会触发(因鼠标位置固定)。 3. **多平台兼容**:此方案在 PC/Mobile 均有效(引用[3]的触控方案可结合使用)[^3]。 ### 示例场景 实现一个射击游戏的「屏幕中心准星」: 1. 创建 `Canvas` 并添加 `Image` 作为准星,锚定到屏幕中心。 2. 附加 `LockedClickHandler` 脚本到该 `Image`。 3. 在 `OnPointerDown` 中调用射击逻辑: ```csharp public void OnPointerDown(PointerEventData eventData) { Shoot(); // 实现射击功能 } ``` --- ### 相关问题 1. **如何在鼠标锁定状态下实现 UI 拖拽操作?** > 需临时切换为 `CursorLockMode.Confined`,拖拽结束后重新锁定(引用[2]的背包逻辑)[^2]。 2. **如何区分 UI 点击与 3D 对象点击?** > 使用 `EventSystem.current.IsPointerOverGameObject()` 检测点击是否在 UI 上。 3. **移动端触控如何适配鼠标锁定模式?** > 通过分割触控区域(引用[3]),将中心区域映射为虚拟鼠标点击[^3]。 4. **锁定状态下如何防止误触其他 UI?** > 禁用非中心区域的 `Raycast Target` 属性,或使用 `CanvasGroup` 阻断交互。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值