Chinaunix首页 | 论坛 | 博客
  • 博客访问: 9727103
  • 博文数量: 1227
  • 博客积分: 10026
  • 博客等级: 上将
  • 技术积分: 20273
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-16 12:40
文章分类

全部博文(1227)

文章存档

2010年(1)

2008年(1226)

我的朋友

分类: 数据库开发技术

2008-03-14 12:25:15

下载本文示例代码
本文主要通过调用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;i0)
 {
  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 username
void 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 username
void 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("发生错误!");
 }
}
作者信息: 肖进 南京中萃食品有限公司( 210061)
下载本文示例代码
阅读(1230) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~