Visual Studio .NET 2002Visual C++ 7.1Visual Studio 6Visual C++ 7.0数据库管理员 (DBA)Windows 2003Windows 2000Visual C++ 6.0Windows XPMFC中级开发Visual StudioSQL ServerSQLWindowsC++
使用 Visual C++ 在 SQL Server 中添加用户






4.14/5 (10投票s)
2003 年 8 月 3 日
1分钟阅读

68693

2075
这篇文章解释了如何使用 VC++ 以编程方式在 SQL Server 中添加用户
引言
在这个项目中,我们可以通过使用系统存储过程和表来添加或删除用户。 在这里,我们将通过 ADO 连接到数据库服务器,因此我们必须首先在 StdAfx.h 中导入文件 ADODB15.dll。
在添加或删除用户之前,我们必须是系统管理员。
使用代码
首先,当我们登录到数据库服务器时,在成功登录后将显示添加/删除用户的窗口。 这里没有显示代码,所以如果你想知道实现,你应该阅读源代码。
- 读取数据库服务器中所有数据库的名称:使用数据库 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 }
- 读取除 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 }
- 检查所有数据库,如果用户有访问它们的权限。 如果用户可以访问数据库,则他的名称将被添加到数据库列表框中。 当用户列表框的行号发生变化时,右侧列表框中的相应数据库名称也会发生变化。 如果数据库中的表
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; }
- 添加新用户并授予用户访问权限,使用系统存储过程
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!"); } }
- 删除现有用户以及在相关数据库上的权限:我们使用系统存储过程
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!"); } }
就是这样!