中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > Visual C++ > 数据库操作
VC在SQL Server7中动态增加/删除用户
作者:未知 时间:2005-07-20 14:19 出处:VC知识库 责编:chinaitpower
              摘要:VC在SQL Server7中动态增加/删除用户

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;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);
	}
}
//查看用户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)
关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有