商城 设为首页注册本站  论坛  繁體中文

慧民电脑芯片级维修-电脑技巧
手机 | MP3 | MP4 | 显卡 | 主板 | 显示器 | 光存储 | 笔记本 | 网络设备 | 移动存储 | 数码相机
键鼠 | CPU | 音箱 | GPS | 电视 | 服务器 | 投影机 | 机箱电源 | 品牌电脑 | 办公打印 |
| 网站首页 | Cisco | Windows | Linux | Java | Dotnet | Oracle | 网页设计 | 平面设计 | 安全 | 软件应用 | 电脑维修 | 办公维修 |
您现在的位置: 电脑技巧 >> Windows >> 服务器技术 >> SQL Server >> Windows正文

VC在SQL Server7中动态增加/删除用户

文章来源:ChinaITLab 收集整理 作者:佚名 更新时间:2005-7-6 【 】 【加入收藏

  本文主要通过调用SQL Server7的系统存储过程和系统表,在程序中动态增加和删除用户。
  
  一、首先用系统管理员帐号登录系统:程序省略,请看源程序。
   
  二、 进入用户管理界面:
  
  1、 读取数据库:从master..sysdatabse中读取所有数据库。
  
  void CUser::AddDataBase()
  {
  _RecordsetPtr rs;
  _bstr_t bt;
  HRESULT hr;
  CString str;
  
  bt=(_bstr_t)"select * from master..sysdatabases";
  try{
  hr=rs.CreateInstance (__uuidof(Recordset));
  ASSERT(SUCCEEDED(hr));
  
  //打开数据源
  hr=rs->Open (bt,cn.GetInterfacePtr (),adOpenDynamic,adLockOptimistic,adCmdText);
  ASSERT(SUCCEEDED(hr));
  rs->MoveFirst();
  while(!rs->EndOfFile)
  {
  str=(char*)(_bstr_t)rs->Fields->GetItem("name")->Value;
  m_database.AddString(str);
  rs->MoveNext();
  }
  rs->Close();
  m_database.SetCurSel(0);
  }
  catch(_com_error)
  {}
  }
  
  2、 读取用户:从master..syslogins视图中读取所有非NT用户。void CUser::AddUser()
  {
  _RecordsetPtr rs;
  _bstr_t bt;
  HRESULT hr;
  CString str;
  bt=(_bstr_t)"select * from master..syslogins where isntname=0";
  try{
  hr=rs.CreateInstance (__uuidof(Recordset));
  ASSERT(SUCCEEDED(hr));
  //打开数据源
  hr=rs->Open (bt,cn.GetInterfacePtr (),adOpenDynamic,adLockOptimistic,adCmdText);
  ASSERT(SUCCEEDED(hr));
  rs->MoveFirst();
  while(!rs->EndOfFile)
  {
  str=(char*)(_bstr_t)rs->Fields->GetItem("name")->Value;
  m_user_list.AddString(str);
  rs->MoveNext();
  }
  rs->Close();
  m_user_list.SetCurSel (0);
  }
  catch(_com_error)
  {}
  }
  
  3、 读取当前用户有权限的数据库:每个数据库有权限的用户在每个数据的sysusers表中。void CUser::OnSelchangeUserList()
  {
  CString strUser,strDB;
  m_db_list.ResetContent ();
  m_user_list.GetText (m_user_list.GetCurSel (),strUser);
  for(int i=0;i<m_database.GetCount ();i++)
  {
  m_database.GetLBText (i,strDB);
  if(HasRight(strUser,strDB))
  {
  m_db_list.AddString (strDB);
  }
  }
  if(m_db_list.GetCount ()>0)
  {
  m_db_list.SetCurSel (0);
  }
  }
  //查看用户user有没有数据库database的权限
  BOOL CUser::HasRight(CString user, CString database)
  {
  _RecordsetPtr rs;
  _bstr_t bt;
  HRESULT hr;
  BOOL bResult=FALSE;
  
  bt=(_bstr_t)"select * from "+(_bstr_t)database+(_bstr_t)"..sysusers where name=''"+(_bstr_t)user+(_bstr_t)"''";
  try{
  hr=rs.CreateInstance (__uuidof(Recordset));
  ASSERT(SUCCEEDED(hr));
  //打开数据源
  hr=rs->Open (bt,cn.GetInterfacePtr (),adOpenDynamic,adLockOptimistic,adCmdText);
  ASSERT(SUCCEEDED(hr));
  
  rs->MoveFirst();
  rs->Close();
  bResult=TRUE;
  }
  catch(_com_error)
  {
  }
  return bResult;
  }
  
  4、 增加用户及授予权限:增加用户调用存储过程sp_addlogin,授予权限调用存储过程sp_grantdbaccess。
  基本用法为:sp_addlogin username,password sp_grantdbaccess usernamevoid CUser::OnOK()
  {
  // TODO: Add extra validation here
  UpdateData();
  
  CString strDB;
  m_database.GetLBText (m_database.GetCurSel(),strDB);
  if(m_user.IsEmpty () || m_user=="sa")
  return;
  try{
  if(m_user_list.FindString (0,m_user)<0)
  {
  cn->Execute ("sp_addlogin ''"+(_bstr_t)m_user+"'',''"+(_bstr_t)m_user+"''",NULL,adExecuteNoRecords);
  m_user_list.AddString (m_user);
  }
  else
  {
  cn->PutDefaultDatabase ((_bstr_t)strDB);
  cn->Execute ("sp_grantdbaccess ''"+(_bstr_t)m_user+(_bstr_t)"''",NULL,adExecuteNoRecords);
  m_db_list.AddString (strDB);
  }
  }
  catch(_com_error)
  {
  AfxMessageBox("发生错误!");
  }
  //CDialog::OnOK();
  }
  
  5、 删除用户及权限: 删除用户调用存储过程sp_droplogin,授予权限调用存储过程sp_revokedbaccess。
  基本用法为:sp_droplogin username
  sp_revokedbaccess usernamevoid CUser::OnBnClickedDel()
  {
  UpdateData();
  m_user.TrimRight ();
  if(m_user.IsEmpty () || m_user=="sa" || m_user_list.FindString (0,m_user)<0)
  {
  AfxMessageBox("不能删除!");
  return;
  }
  
  CString strDB;
  m_database.GetLBText (m_database.GetCurSel (),strDB);
  try{
  if(m_db_list.GetCount ()<1)
  {//删除用户
  cn->Execute ("exec sp_droplogin ''"+(_bstr_t)m_user+"''",NULL,adExecuteNoRecords);
  m_user_list.DeleteString (m_user_list.FindString (0,m_user));
  
  }
  else
  {//删除权限
  if(m_db_list.FindString (0,strDB)>=0)
  {
  cn->PutDefaultDatabase ((_bstr_t)strDB);
  cn->Execute ("exec sp_revokedbaccess ''"+(_bstr_t)m_user+"''",NULL,adExecuteNoRecords);
  m_db_list.DeleteString (m_db_list.FindString (0,strDB));
  }
  }
  }
  catch(_com_error)
  {
  AfxMessageBox("发生错误!");
  }
  }
  • 上一篇Windows:

  • 下一篇Windows:
  • 最 新 热 门
     低配置电脑如何优化Vista系统运行如飞似XP
     安全修改注册表默认响应方式
     禁用Vista下的硬盘监控任务栏警告
     巧用GhostEXP 将补丁加入GHO文件
     windows运行中几个特殊的执行命令
     技巧:用MSDaRT解决Vista启动故障
     XP中一人远程管理关机好方法
     一次简单修改 让WinRAR解压缩速度更快
     彻底禁用暴风顽固进程 让系统清爽起来
     通吃主流格式 让系统图片查看器更完美
    最 新 推 荐
     您的SQL Server应用程序查询正在浪费内存吗…
     SQL Server服务器内存升级后的烦恼
     SQL大型事务日志备份与修复问题
     如何更好的管理一台服务器上的多个数据库?
     免费SQL注入扫描程序
     SQL Server 2005的output子句用法
     解决SQL Server不允许进行远程连接
     SQL Server 2005混合模式登录配置
     使用SQL Server中COALESCE()函数的方法
     SQL Server对上亿表的排序和join的问题解决
    相 关 文 章

    在VC中添加资源文件,使Vista上用管理员权限
    临时表在SQL Server和MySql中创建的方法
    Windows系统中Svchost进程应用技巧
    在SQL Server 2008中运用表值参数
    只读域控制器在Server Core中的部署
    在SQL中用 SP_KEYS确定一个表格的关键键
    在SQL Server中处理空值时涉及的三个问题
    揭秘Vista进程中12个svchost.exe
    解决svchost.exe占用CPU 100%方法
    在SQL Server中使用CLR调用.NET方法

    | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 网站公告

      Copyright 2006-2008 pcjx.com All Rights Reserved
    电脑技巧 版权所有 粤ICP备06059145号 地图
    门市地址:广东省佛山市南海区黄岐黄海路133号
    本网站所有内容未经许可不得转载或做其他使用
    电话:0757-81139980 QQ:83306923