⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sdbms.cpp

📁 使用yacc的一个例子
💻 CPP
📖 第 1 页 / 共 5 页
字号:

	//判断当前用户是否有权执行Set Child Role命令
	if	(!HaveSystemRight(SR_SET_CHILD_ROLE, m_pCurUser, m_pCurDB))
		return	FALSE;

	if	(m_pCurDB->SetChildRole(strParentRoleName, strChildRoleName))
	{
		//设置审计记录中操作成功属性为真
		if	(bAuditSuccess)
			m_audit.SetOperateSuccess();

		//通知界面更新数据
		g_msg.UpdateUser();
		g_msg.UpdateRole();

		return	TRUE;
	}
	else
		return	FALSE;
}

/**********************************************************************
功能:设置某角色为当前数据库的顶层角色
***********************************************************************/
BOOL CSdbms::DoSetTopRole(CString strRoleName)
{
	ASSERT(m_pCurUser);

	//审计
	BOOL bAuditSuccess = m_audit.Audit(m_pCurUser, SR_SET_TOP_ROLE, m_pCurDB);

	CantUseRoleName(strRoleName, SYSTEM_ROLE_SYSTEM);		//不能使用系统定义的角色名
	CantUseRoleName(strRoleName, SYSTEM_ROLE_DBSA);
	CantUseRoleName(strRoleName, SYSTEM_ROLE_DBA);
	CantUseRoleName(strRoleName, SYSTEM_ROLE_LOGIN);
	CantUseRoleName(strRoleName, SYSTEM_ROLE_GUEST);
	CantUseRoleName(strRoleName, SYSTEM_ROLE_OWNER);

	//检查当前是否有连接的数据库
	if	(m_pCurDB == NULL)
	{
		g_msg.ThrowErrorMsg("当前没有数据库被打开");
		return	FALSE;
	}

	ASSERT(m_pCurDB->m_bInit && m_pCurDB->m_pRole);

	//判断当前用户是否有权执行Set TOP Role命令
	if	(!HaveSystemRight(SR_SET_TOP_ROLE, m_pCurUser, m_pCurDB))
		return	FALSE;

	if	(m_pCurDB->SetTopRole(strRoleName))
	{
		//设置审计记录中操作成功属性为真
		if	(bAuditSuccess)
			m_audit.SetOperateSuccess();

		//通知界面更新数据
		g_msg.UpdateUser();
		g_msg.UpdateRole();

		return	TRUE;
	}
	else
		return	FALSE;
}

/**********************************************************************
功能:把用户加入到当前连接的数据库上的一个角色中
***********************************************************************/
BOOL CSdbms::DoAddUserToRole(CString strUserName, CString strRoleName)
{
	ASSERT(m_pCurUser);

	//审计
	BOOL bAuditSuccess = m_audit.Audit(m_pCurUser, SR_ADD_ROLE, m_pCurDB);

	CantUseRoleName(strRoleName, SYSTEM_ROLE_LOGIN);			//不能使用系统定义的角色名
	CantUseRoleName(strRoleName, SYSTEM_ROLE_GUEST);
	CantUseRoleName(strRoleName, SYSTEM_ROLE_OWNER);

	CSdbms_User *pUser;
	if	(!GetUser(strUserName, &pUser))				//检查用户名是否已存在
	{
		sprintf(g_strMsg, "用户%s不存在", strUserName);
		g_msg.ThrowErrorMsg(g_strMsg);
		return	FALSE;
	}

	if	((IsOwnDbsaRole(pUser->m_nUserID)) && (strRoleName.CompareNoCase(SYSTEM_ROLE_DBSA) != 0))
	{
		sprintf(g_strMsg, "用户%s属于DBSA角色,不能把DBSA用户加入到任何其他角色中", pUser->m_strUserName);
		g_msg.ThrowErrorMsg(g_strMsg);
		return	FALSE;
	}

	BOOL bRtn = FALSE;
	if	(strRoleName.CompareNoCase(SYSTEM_ROLE_SYSTEM) == 0)	//加入到SYSTEM角色中
	{
		//判断当前用户是否有权把用户加到SYSTEM角色中
		if	(!HaveSystemRight(SR_ADDDEL_SYSTEM_ROLE, m_pCurUser, NULL))
			return	FALSE;
		bRtn = InsertRoleUserList(pUser, m_pSystemRole);
	}
	else if	(strRoleName.CompareNoCase(SYSTEM_ROLE_DBSA) == 0)	//加入到DBSA角色中
	{
		//判断当前用户是否有权把用户加到DBSA角色中
		if	(!HaveSystemRight(SR_ADDDEL_DBSA_ROLE, m_pCurUser, NULL))
			return	FALSE;
		bRtn = InsertRoleUserList(pUser, m_pDbsaRole);
	}
	else if	(strRoleName.CompareNoCase(SYSTEM_ROLE_DBA) == 0)		//加入到DBA角色中
	{
		//判断当前用户是否有权把用户加到DBA角色中
		if	(!HaveSystemRight(SR_ADDDEL_DBA_ROLE, m_pCurUser, NULL))
			return	FALSE;
		bRtn = InsertRoleUserList(pUser, m_pDbaRole);
	}
	else
	{
		//检查当前是否有连接的数据库
		if	(m_pCurDB == NULL)
		{
			g_msg.ThrowErrorMsg("当前没有数据库被打开");
			return	FALSE;
		}

		ASSERT(m_pCurDB->m_bInit && m_pCurDB->m_pRole);

		//判断当前用户是否有权执行Add Role命令
		if	(!HaveSystemRight(SR_ADD_ROLE, m_pCurUser, m_pCurDB))
			return	FALSE;

		bRtn = m_pCurDB->AddUserToRole(pUser, strRoleName);
	}

	if	(bRtn)
	{
		//设置审计记录中操作成功属性为真
		if	(bAuditSuccess)
			m_audit.SetOperateSuccess();

		//通知界面更新数据
		g_msg.UpdateUser();
		g_msg.UpdateRole();

		return	TRUE;
	}
	else
		return	FALSE;
}


/**********************************************************************
功能:把用户从一个角色中删除
***********************************************************************/
BOOL CSdbms::DoDelUserFromRole(CString strUserName, CString strRoleName)
{
	ASSERT(m_pCurUser);

	//审计
	BOOL bAuditSuccess = m_audit.Audit(m_pCurUser, SR_DEL_ROLE, m_pCurDB);

	CantUseRoleName(strRoleName, SYSTEM_ROLE_LOGIN);			//不能使用系统定义的角色名
	CantUseRoleName(strRoleName, SYSTEM_ROLE_GUEST);
	CantUseRoleName(strRoleName, SYSTEM_ROLE_OWNER);
	CSdbms_User *pUser;
	if	(!GetUser(strUserName, &pUser))				//检查用户名是否已存在
	{
		sprintf(g_strMsg, "用户%s不存在", strUserName);
		g_msg.ThrowErrorMsg(g_strMsg);
		return	FALSE;
	}

	BOOL bRtn = FALSE;
	if	(strRoleName.CompareNoCase(SYSTEM_ROLE_SYSTEM) == 0)	//从SYSTEM角色中删除
	{
		if	(!HaveSystemRight(SR_ADDDEL_SYSTEM_ROLE, m_pCurUser, NULL))
			return	FALSE;
		bRtn = RemoveRoleUserList(pUser, m_pSystemRole);
	}
	else if	(strRoleName.CompareNoCase(SYSTEM_ROLE_DBSA) == 0)	//从DBSA角色中删除
	{
		if	(!HaveSystemRight(SR_ADDDEL_DBSA_ROLE, m_pCurUser, NULL))
			return	FALSE;
		bRtn = RemoveRoleUserList(pUser, m_pDbsaRole);
	}
	else if	(strRoleName.CompareNoCase(SYSTEM_ROLE_DBA) == 0)		//从DBA角色中删除
	{
		if	(!HaveSystemRight(SR_ADDDEL_DBA_ROLE, m_pCurUser, NULL))
			return	FALSE;
		bRtn = RemoveRoleUserList(pUser, m_pDbaRole);
	}
	else
	{
		//检查当前是否有连接的数据库
		if	(m_pCurDB == NULL)
		{
			g_msg.ThrowErrorMsg("当前没有数据库被打开");
			return	FALSE;
		}

		ASSERT(m_pCurDB->m_bInit && m_pCurDB->m_pRole);

		//判断当前用户是否有权执行Del Role命令
		if	(!HaveSystemRight(SR_DEL_ROLE, m_pCurUser, m_pCurDB))
			return	FALSE;

		bRtn = m_pCurDB->DelUserFromRole(pUser, strRoleName);
	}

	if	(bRtn)
	{
		//设置审计记录中操作成功属性为真
		if	(bAuditSuccess)
			m_audit.SetOperateSuccess();

		//通知界面更新数据
		g_msg.UpdateUser();
		g_msg.UpdateRole();

		return	TRUE;
	}
	else
		return	FALSE;
}


/**********************************************************************
功能:改变用户在当前连接的数据库上的角色为新的角色(不影响其他数据库及全局角色)
***********************************************************************/
BOOL CSdbms::DoChangeRole(CString strUserName, CString strRoleNames)
{
	ASSERT(m_pCurUser);

	//审计
	BOOL bAuditSuccess = m_audit.Audit(m_pCurUser, SR_CHANGE_ROLE, m_pCurDB);

	CSdbms_User *pUser;
	if	(!GetUser(strUserName, &pUser))				//检查用户名是否已存在
	{
		sprintf(g_strMsg, "用户%s不存在", strUserName);
		g_msg.ThrowErrorMsg(g_strMsg);
		return	FALSE;
	}

	//检查当前是否有连接的数据库
	if	(m_pCurDB == NULL)
	{
		g_msg.ThrowErrorMsg("当前没有数据库被打开");
		return	FALSE;
	}

	ASSERT(m_pCurDB->m_bInit && m_pCurDB->m_pRole);

	//判断当前用户是否有权执行Change Role命令
	if	(!HaveSystemRight(SR_CHANGE_ROLE, m_pCurUser, m_pCurDB))
		return	FALSE;

	m_pCurDB->DelAllRole(pUser);	//删除所有以前的角色

	CString strRoleName[100];
	int nRoleCount = ParseStrings(strRoleNames, strRoleName);	//解析出角色名
	for	(int i=0; i<nRoleCount; i++)
	{
		CantUseRoleName(strRoleName[i], SYSTEM_ROLE_LOGIN);			//不能使用系统定义的角色名
		CantUseRoleName(strRoleName[i], SYSTEM_ROLE_GUEST);
		CantUseRoleName(strRoleName[i], SYSTEM_ROLE_OWNER);
		m_pCurDB->AddUserToRole(pUser, strRoleName[i]);
	}

	//设置审计记录中操作成功属性为真
	if	(bAuditSuccess)
		m_audit.SetOperateSuccess();

	return	TRUE;
}


/**********************************************************************
功能:把一个系统权限授权给当前数据库中的一个自定义角色
***********************************************************************/
BOOL CSdbms::DoGrant(SystemRight nSystemRight, CString strRoleName)
{
	ASSERT(m_pCurUser);
	ASSERT(!strRoleName.IsEmpty());

	//审计
	BOOL bAuditSuccess = m_audit.Audit(m_pCurUser, SR_GRANT_SYSTEM, m_pCurDB);

	CantUseRoleName(strRoleName, SYSTEM_ROLE_SYSTEM);	//不能授权给系统预定义角色
	CantUseRoleName(strRoleName, SYSTEM_ROLE_DBSA);
	CantUseRoleName(strRoleName, SYSTEM_ROLE_DBA);
	CantUseRoleName(strRoleName, SYSTEM_ROLE_LOGIN);
	CantUseRoleName(strRoleName, SYSTEM_ROLE_GUEST);
	CantUseRoleName(strRoleName, SYSTEM_ROLE_OWNER);

	//检查当前是否有连接的数据库
	if	(m_pCurDB == NULL)
	{
		g_msg.ThrowErrorMsg("当前没有数据库被打开");
		return	FALSE;
	}

	ASSERT(m_pCurDB->m_bInit && m_pCurDB->m_pRole);

	//判断当前用户是否有权执行系统权限GRANT命令
	if	(!HaveSystemRight(SR_GRANT_SYSTEM, m_pCurUser, m_pCurDB))
		return	FALSE;

	//进一步判断
	if	((nSystemRight == SR_CREATE_DATABASE || nSystemRight == SR_DROP_DATABASE) &&
		 (!IsOwnDbaRole(m_pCurUser->m_nUserID) || !IsOwnSystemRole(m_pCurUser->m_nUserID)))
	{
		sprintf(g_strMsg, "用户%s无权授权%s命令", m_pCurUser->m_strUserName, g_strSystemRight[nSystemRight]);
		g_msg.ThrowErrorMsg(g_strMsg);
		return	FALSE;
	}

	if	(m_pCurDB->Grant(nSystemRight, strRoleName, m_pCurUser->m_nUserID))
	{
		//设置审计记录中操作成功属性为真
		if	(bAuditSuccess)
			m_audit.SetOperateSuccess();
		return	TRUE;
	}
	else
		return	FALSE;
}

/**********************************************************************
功能:把一个系统权限从当前数据库中的一个自定义角色中收回授权
***********************************************************************/
BOOL CSdbms::DoRevoke(SystemRight nSystemRight, CString strRoleName)
{
	ASSERT(m_pCurUser);
	ASSERT(!strRoleName.IsEmpty());

	//审计
	BOOL bAuditSuccess = m_audit.Audit(m_pCurUser, SR_REVOKE_SYSTEM, m_pCurDB);

	CantUseRoleName(strRoleName, SYSTEM_ROLE_SYSTEM);	//不能从系统预定义角色收回授权
	CantUseRoleName(strRoleName, SYSTEM_ROLE_DBSA);
	CantUseRoleName(strRoleName, SYSTEM_ROLE_DBA);
	CantUseRoleName(strRoleName, SYSTEM_ROLE_LOGIN);
	CantUseRoleName(strRoleName, SYSTEM_ROLE_GUEST);
	CantUseRoleName(strRoleName, SYSTEM_ROLE_OWNER);

	//检查当前是否有连接的数据库
	if	(m_pCurDB == NULL)
	{
		g_msg.ThrowErrorMsg("当前没有数据库被打开");
		return	FALSE;
	}

	ASSERT(m_pCurDB->m_bInit && m_pCurDB->m_pRole);

	//判断当前用户是否有权执行系统权限REVOKE命令
	if	(!HaveSystemRight(SR_REVOKE_SYSTEM, m_pCurUser, m_pCurDB))
		return	FALSE;

	//进一步判断
	if	((nSystemRight == SR_CREATE_DATABASE || nSystemRight == SR_DROP_DATABASE) &&
		 (!IsOwnDbaRole(m_pCurUser->m_nUserID) || !IsOwnSystemRole(m_pCurUser->m_nUserID)))
	{
		sprintf(g_strMsg, "用户%s无权收回授权%s命令", m_pCurUser->m_strUserName, g_strSystemRight[nSystemRight]);
		g_msg.ThrowErrorMsg(g_strMsg);
		return	FALSE;
	}

	if	(m_pCurDB->Revoke(nSystemRight, strRoleName, m_pCurUser->m_nUserID))
	{
		//设置审计记录中操作成功属性为真
		if	(bAuditSuccess)
			m_audit.SetOperateSuccess();
		return	TRUE;
	}
	else
		return	FALSE;
}

/**********************************************************************
功能:把在某个表的某些列上的权限授予给某个角色
参数说明:
		nObjectRight,	//表上的操作编号
		strTableName,	//表名
		strFieldNames,	//列名
		strRoleName,	//要授予的角色名
		bCanGrant,		//可否把权限授予给其他人
		pCondition,	//谓词条件的语法树
***********************************************************************/
BOOL CSdbms::DoGrant(ObjectRight nObjectRight, CString strTableName, CString strFieldName, 
					 CString strRoleName, BOOL bCanGrant/*=FALSE*/, CSdbms_Condition *pCondition/*=NULL*/)
{
	ASSERT(m_pCurUser);
	ASSERT(!strRoleName.IsEmpty());

	//审计
	BOOL bAuditSuccess = m_audit.Audit(m_pCurUser, SR_GRANT_OBJECT, m_pCurDB);

	CantUseRoleName(strRoleName, SYSTEM_ROLE_SYSTEM);	//不能授权给系统预定义角色
	CantUseRoleName(strRoleName, SYSTEM_ROLE_DBSA);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -