65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 Visual C++ 在 SQL Server 中添加用户

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.14/5 (10投票s)

2003 年 8 月 3 日

1分钟阅读

viewsIcon

68693

downloadIcon

2075

这篇文章解释了如何使用 VC++ 以编程方式在 SQL Server 中添加用户

引言

在这个项目中,我们可以通过使用系统存储过程和表来添加或删除用户。 在这里,我们将通过 ADO 连接到数据库服务器,因此我们必须首先在 StdAfx.h 中导入文件 ADODB15.dll

在添加或删除用户之前,我们必须是系统管理员。

使用代码

首先,当我们登录到数据库服务器时,在成功登录后将显示添加/删除用户的窗口。 这里没有显示代码,所以如果你想知道实现,你应该阅读源代码。

  1. 读取数据库服务器中所有数据库的名称:使用数据库 master 的表 sysdatabases
    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)); 
            //the pointer of recordset must be valid
            //open the recordset
            hr=rs->Open (bt,cn.GetInterfacePtr (),
              adOpenDynamic,adLockOptimistic,adCmdText);
            ASSERT(SUCCEEDED(hr));  
            rs->MoveFirst();  //move to the first record
            while(!rs->EndOfFile)
            {   //read the name of databse
                str=(char*)(_bstr_t)rs->Fields->GetItem("name")->Value;
                m_database.AddString(str);  
                rs->MoveNext();
            }
            rs->Close();  //close the recordset
            m_database.SetCurSel(0);
        }
        catch(_com_error)
        {}  //if error then do nothing
    }
  2. 读取除 NT 域用户之外的所有用户的名称:使用数据库 master 的视图 syslogins。
    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));
            //open recordset
            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)
        {}//if error then do nothing
    }
  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);
        }
    }

    检查用户是否有权访问数据库。

    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));
            //open the recordset
            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 用户名,密码
    • sp_grantdbaccess 用户名
    void CUser::OnOK()
    {
        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("Error!");
        }
    }
  5. 删除现有用户以及在相关数据库上的权限:我们使用系统存储过程 sp_droplogin 删除用户,并使用系统存储过程 sp_revokedbaccess 删除数据库上的权限。

    基本用法

    • sp_droplogin 用户名
    • sp_revokedbaccess 用户名
    void CUser::OnBnClickedDel()
    {
        UpdateData();
        m_user.TrimRight ();
        if(m_user.IsEmpty () || m_user=="sa" || 
            m_user_list.FindString (0,m_user)<0)
        {
            AfxMessageBox("Can’t Delete it or empty!");
            return;
        }
    
        CString strDB;
        m_database.GetLBText (m_database.GetCurSel (),strDB);
        try{
            if(m_db_list.GetCount ()<1)
            {//delete user
                cn->Execute ("exec sp_droplogin '"+(_bstr_t)m_user+
                    "'",NULL,adExecuteNoRecords);
                m_user_list.DeleteString (
                    m_user_list.FindString (0,m_user));
            }
            else
            {//delete access priviliage
                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("ERROR!");
        }
    }

就是这样!

© . All rights reserved.