123
返回列表 发新帖
楼主: oldboy

如何实现类似QQ的登陆的一个功能。

[复制链接]
论坛徽章:
12
数据库板块每日发贴之星
日期:2005-06-27 01:01:25ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412010新春纪念徽章
日期:2010-03-01 11:08:29生肖徽章2007版:鸡
日期:2008-01-02 17:35:53ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44会员2007贡献徽章
日期:2007-09-26 18:42:10数据库板块每日发贴之星
日期:2007-06-25 01:02:07授权会员
日期:2006-05-04 13:31:19ITPUB元老
日期:2006-05-04 13:38:51会员2006贡献徽章
日期:2006-04-17 13:46:34
21#
 楼主| 发表于 2005-2-27 13:17 | 只看该作者
biti大哥说的都有理,问题是,我在SYSTEM登陆触发器中写了RAISE来触发一个错误,但在用户登陆时,没有提示这个错误提示,是否是系统登陆触发器中,不能输入使用RAISE来触发事件。

使用道具 举报

回复
论坛徽章:
86
ITPUB元老
日期:2005-02-28 12:57:002012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20咸鸭蛋
日期:2012-05-08 10:27:19版主8段
日期:2012-05-15 15:24:112013年新春福章
日期:2013-02-25 14:51:24
22#
发表于 2005-2-27 13:24 | 只看该作者
最初由 oldboy 发布
[B]biti大哥说的都有理,问题是,我在SYSTEM登陆触发器中写了RAISE来触发一个错误,但在用户登陆时,没有提示这个错误提示,是否是系统登陆触发器中,不能输入使用RAISE来触发事件。 [/B]


说了半天,你不把trigger拿出来,别人也不明白你是如何处理的,问题在哪里

你是要kill 另一个session ,不是给自己raise 一个错误。

使用道具 举报

回复
论坛徽章:
12
数据库板块每日发贴之星
日期:2005-06-27 01:01:25ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412010新春纪念徽章
日期:2010-03-01 11:08:29生肖徽章2007版:鸡
日期:2008-01-02 17:35:53ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44会员2007贡献徽章
日期:2007-09-26 18:42:10数据库板块每日发贴之星
日期:2007-06-25 01:02:07授权会员
日期:2006-05-04 13:31:19ITPUB元老
日期:2006-05-04 13:38:51会员2006贡献徽章
日期:2006-04-17 13:46:34
23#
 楼主| 发表于 2005-2-27 13:38 | 只看该作者
现在是先看这个提示是否出来。但没有成功。下面是例子:
1.创建提示过程。
create or replace procedure testuser_logon as
  v_Error Varchar2(255);
  Err_log Exception;

begin
  v_Error := 'user logon test!';
  Raise Err_log;
EXCEPTION
  When Err_log Then
    Raise_application_error(-20101, '[test]' || v_Error || '[test]');
  WHEN OTHERS THEN
    null;
  
end;

2.创建系统登陆触发器。
create or replace trigger testuser_logon
after logon
on database
   call testuser_logon
3.登陆,已一个SYSTEM用户登陆,却始终不显示这个错误提示。

使用道具 举报

回复
论坛徽章:
12
数据库板块每日发贴之星
日期:2005-06-27 01:01:25ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412010新春纪念徽章
日期:2010-03-01 11:08:29生肖徽章2007版:鸡
日期:2008-01-02 17:35:53ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44会员2007贡献徽章
日期:2007-09-26 18:42:10数据库板块每日发贴之星
日期:2007-06-25 01:02:07授权会员
日期:2006-05-04 13:31:19ITPUB元老
日期:2006-05-04 13:38:51会员2006贡献徽章
日期:2006-04-17 13:46:34
24#
 楼主| 发表于 2005-2-27 14:56 | 只看该作者
我希望就是在杀死对方的情况下,还应该给对方一个提示。类似QQ的提示,用户已经在别处登陆了。

使用道具 举报

回复
论坛徽章:
12
数据库板块每日发贴之星
日期:2005-06-27 01:01:25ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412010新春纪念徽章
日期:2010-03-01 11:08:29生肖徽章2007版:鸡
日期:2008-01-02 17:35:53ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44会员2007贡献徽章
日期:2007-09-26 18:42:10数据库板块每日发贴之星
日期:2007-06-25 01:02:07授权会员
日期:2006-05-04 13:31:19ITPUB元老
日期:2006-05-04 13:38:51会员2006贡献徽章
日期:2006-04-17 13:46:34
25#
 楼主| 发表于 2005-2-27 15:48 | 只看该作者
不知怎的,这个过程对一般用户有效,但对DBA用户没有效果,如何能够拦截所有的用户。请大家继续讨论。

使用道具 举报

回复
论坛徽章:
12
数据库板块每日发贴之星
日期:2005-06-27 01:01:25ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412010新春纪念徽章
日期:2010-03-01 11:08:29生肖徽章2007版:鸡
日期:2008-01-02 17:35:53ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44会员2007贡献徽章
日期:2007-09-26 18:42:10数据库板块每日发贴之星
日期:2007-06-25 01:02:07授权会员
日期:2006-05-04 13:31:19ITPUB元老
日期:2006-05-04 13:38:51会员2006贡献徽章
日期:2006-04-17 13:46:34
26#
 楼主| 发表于 2005-2-27 15:48 | 只看该作者
修改后的触发器:
CREATE OR REPLACE TRIGGER USER_LOGON
AFTER LOGON
ON DATABASE
DECLARE
  V_ERROR VARCHAR2(255);
  ERR_LOGON EXCEPTION;
  CURSOR C_USER IS
    SELECT SID,
           SERIAL#,
           USER#,
           USERNAME,
           OSUSER,
           MACHINE,
           TERMINAL,
           PROGRAM,
           LOGON_TIME
      FROM V$SESSION
     WHERE TYPE = 'USER' AND USERNAME <> ' ' AND
           TO_CHAR(LOGON_TIME, 'YYYY-MM-DD HH24:MI:SS') <
           TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI') || ':' ||
           (TO_CHAR(SYSDATE, 'SS') - 5);

BEGIN
  V_ERROR := 'USER LOGON TEST 123!';

  FOR V_USER IN C_USER LOOP
    IF USER = V_USER.USERNAME THEN
      V_ERROR := '用户 ' || USER || ' 已经在' || V_USER.MACHINE ||
                 '机器上进行了登陆,' || CHR(10) || '登陆时间为 ' ||
                 TO_CHAR(V_USER.LOGON_TIME, 'YYYY-MM-DD HH24:MI:SS') ||
                 ',使用的程序为' || V_USER.PROGRAM || ',' || CHR(10) ||
                 '请先关闭它后,再进行登陆!';
      RAISE ERR_LOGON;
      --EXIT;
   
    END IF;
  END LOOP;

EXCEPTION
  WHEN ERR_LOGON THEN
    RAISE_APPLICATION_ERROR(-20101, V_ERROR);
  WHEN OTHERS THEN
    NULL;
  
END;
/

使用道具 举报

回复
论坛徽章:
86
ITPUB元老
日期:2005-02-28 12:57:002012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20咸鸭蛋
日期:2012-05-08 10:27:19版主8段
日期:2012-05-15 15:24:112013年新春福章
日期:2013-02-25 14:51:24
27#
发表于 2005-2-27 16:46 | 只看该作者
1: logon  trigger 对 DBA角色用户无效
2:如果你想返回一个提示,这是需要应用来配合处理的,比如你自己定义的信息和编号可能不是当作正常显示而是异常了。你光考虑服务器返回提示信息是不够的,要考虑应用能正常接收显示并继续。如何应用可以修改来配合,我不确信trigger 返回的信息能否被正常识别并且程序继续进行,这需要测试。如果遇到问题,可以插入一个记录用户登陆信息表使得应用登陆之后就立即检查被自己登陆时候kill掉的session的相关信息。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表