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

daysurpass

daysurpass

2016-02-19 21:45

今天图老师小编给大家展示的是VC在SQL Server7中动态增加/删除用户,精心挑选的内容希望大家多多支持、多多分享,喜欢就赶紧get哦!

  本文主要通过调用SQL Server7的系统存储过程和系统表,在程序中动态增加和删除用户。

  一、首先用系统管理员帐号登录系统:程序省略,请看源程序。

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)

 

  二、 进入用户管理界面:

 

  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)
  {}
}

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)

  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;im_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 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("发生错误!");
  }
}

展开更多 50%)
分享

猜你喜欢

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

编程语言 网络编程
VC在SQL Server7中动态增加/删除用户

通过非动态SQL语句在SQL Server中执行动态查询

编程语言 网络编程
通过非动态SQL语句在SQL Server中执行动态查询

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

在SQL Server中快速删除重复记录

MySQL mysql数据库
在SQL Server中快速删除重复记录

SQL Server7移动数据的6种方法

编程语言 网络编程
SQL Server7移动数据的6种方法

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

搞不清SQL SERVER 2005 中的用户

编程语言 网络编程
搞不清SQL SERVER 2005 中的用户

SQL Server中的动态和静态内存分配

SQLServer
SQL Server中的动态和静态内存分配

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

xml文件调用css

xml文件调用css

Word2010如何实现鼠标指向自动显示提示文字

Word2010如何实现鼠标指向自动显示提示文字
下拉加载更多内容 ↓