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

2016-02-19 21:45 16 1 收藏

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

【 tulaoshi.com - 编程语言 】

  本文主要通过调用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)
  {}
}

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

  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

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

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

来源:http://www.tulaoshi.com/n/20160219/1627051.html

延伸阅读
首先需要说明的是这篇文章的内容并不是如何调节SQL Server查询性能的(有关这方面的内容能写一本书),而是如何在SQL Server查询性能的调节中利用SET STATISTICS IO和SET STATISTICS TIME这二条被经常忽略的Transact-SQL命令的。 从表面上看,查询性能的调节是一件十分简单的事。从本质上讲,我们希望查询的运行速度能够尽可能地快,...
标签: Web开发
通过ADO可以访问SQL SERVER,并执行相应的SQL语句建库、建表,下面是SQL SERVER BOOKS ONLINE中的相关定义。     建表:   CREATE TABLE   [       database_name.[owner].       | owner. &n...
标签: SQLServer
引言 在负责咨询工作的过去 6 年中,我曾多次听说关于数据访问和操作方面的问题,它时刻困扰着用户:“如何编写应用程序,以便只需对其进行很少的改动或不进行改动即可使用数据库服务器 x、y 和 z?”由于知道数据访问层仍然是现代应用程序的最关键部分,并且通常是经验不足的开发人员的头号敌人,因此我的第一反应始终是:根本办不到! ...
SQL Server有很多很好用的小功能,但是有时候这些功能反过来给你制造麻烦。其中一个这样的问题是别名用户的使用。本技巧教你如何在数据库中建立别名用户时找到安全漏洞,不过在SQL Server 2008种不推荐这个功能。 首先,你可以对每个数据库运行下面的简单查询或者针对所有数据库操作它来运行以便找到带有“dbo”访问权限的用户。 ...
void smsLogon::InitSQLServer(CString server, CString db, CString UserName, CString Pwd) { m_pConnection.CreateInstance("ADODB.Connection"); CString strCn; strCn.Empty(); strCn="provider=SQLOLEDB;data source="+server +";initial catalog="+db +";userID="+UserN...

经验教程

760

收藏

42
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部