1

我在 Oracle 数据库中有两个表:USERSUSERLOG

  • USERS包含所有系统用户详细信息(IDCOL、、、EMAILISLOCKED

  • USERLOG是用户何时登录系统的日志(USERID, LOGIN(日期字段))

关键字段:USERS.IDCOL=USERLOG.USERID

删除的用户从 USERS 表中删除;因此,将有一些 IDUSERLOG与表不匹配USERS

我想对用户列表做两件事:

  1. 锁定在过去 9 个月内未访问系统的所有用户(即他们的 ID 在过去 9 个月内没有出现USERLOG,我猜这将使用类似:

    months_between( SYSDATE , USERLOG.LOGIN ) <= 9
    
  2. 锁定在 中只有一个条目的任何用户,USERLOG只要它不在上个月/30 天内(即创建帐户时)

要锁定用户,我需要将USERS.ISLOCKED列更新01

非常感谢

4

2 回答 2

1

个月之间(SYSDATE,USERLOG.LOGIN)<= 9

1)在这种情况下, userlog.login 不是来自单行,而是一系列登录中的最大登录时间。有不同的方法可以做到这一点,但我认为下面的查询更清楚地捕获了需求。“过去 9 个月内未登录的所有用户”

select *
from   users usr
where  not exists (
    select 1
    from   userlog log
    where  usr.user_id  = log.user_id
      and  log.login    > add_months(sysdate,-9)
)

检查以确保您正在获取您的用户,查找并将此选择转换为删除。

2)这将是满足这两个规则的两个不同条件..

select *
from   users
where  not exists (
    select 1
    from   userlog
    where users.userid = userlog.userid
      and userlog.login > add_months(sysdate,-1)
) AND (
     1 = (select count(*)
     from   userlog
     where  users.userid = userlog.userid)
    )
于 2013-04-08T15:08:42.870 回答
1

无法测试它,但第一个

update users a 
set islocked = 1 
where exists (
    select  1
    from    userlog b
    where   a.idcol = b.userid
    group  by b.userid
    having  months_betwen(sysdte , max(userlog)) <= 9)

第二个,如果我没记错的话,你想锁定 30 多天前只有一个入口的用户....如果是这样,那么

update users set islocked = 1 
where idcol in (
    select  userid
    from    userlog
    group by userid
    having count(*) = 1
    and count(case when month_between(login , sysdate) < 1 then 1 else null end) = 0)

所以我基本上是在计算上个月和整体的入口。语法可能已关闭,我无法在此处运行示例。

于 2013-04-08T15:36:59.070 回答