Chinaunix首页 | 论坛 | 博客
  • 博客访问: 577837
  • 博文数量: 752
  • 博客积分: 40000
  • 博客等级: 大将
  • 技术积分: 5005
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-13 14:47
文章分类

全部博文(752)

文章存档

2011年(1)

2008年(751)

我的朋友

分类:

2008-10-13 16:55:32

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



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

阅读(350) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~