📄 sdbms.cpp
字号:
/* //重新设置所有用户的m_pos
POSITION pos = m_UserList.GetHeadPosition();
while (pos != NULL)
{
CSdbms_User *pUser = m_UserList.GetNext(pos);
pUser->m_pos = NULL;
}
*/
// m_nMaxDBID++; //创建新数据库,并加入到数据库链表中
CSdbms_Database *pDatabase;
pDatabase = new CSdbms_Database(strDatabaseName, m_nMaxDBID++, strDatabaseName+".db", m_pCurUser);
pDatabase->m_bInit = true;
m_DBList.AddTail(pDatabase);
m_pCurDB = pDatabase; //当前数据库为新建的数据库
//设置审计记录中操作成功属性为真
if (bAuditSuccess)
m_audit.SetOperateSuccess();
sprintf(g_strMsg, "创建新数据库%s成功", strDatabaseName);
g_msg.ThrowSuccessMsg(g_strMsg);
//通知界面更新数据
g_msg.UpdateUser();
g_msg.UpdateRole();
g_msg.UpdateTable();
return TRUE;
}
/**********************************************************************
功能:删除数据库
***********************************************************************/
BOOL CSdbms::DoDropDatabase(CString strDatabaseName)
{
ASSERT(m_pCurUser);
//审计
BOOL bAuditSuccess = m_audit.Audit(m_pCurUser, SR_DROP_DATABASE, m_pCurDB);
//判断当前用户是否有权执行Drop Database命令
if (!HaveSystemRight(SR_DROP_DATABASE, m_pCurUser, NULL))
return FALSE;
CSdbms_Database *pDB = NULL;
POSITION prepos, pos=m_DBList.GetHeadPosition();
while (pos != NULL)
{
prepos = pos;
pDB = m_DBList.GetNext(pos);
if (strDatabaseName.CompareNoCase(pDB->m_strDBName) == 0) //检查数据库名是否存在
{
m_DBList.RemoveAt(prepos); //从全局数据库链表中删去该数据库指针
delete pDB; //释放数据库占的空间
//设置审计记录中操作成功属性为真
if (bAuditSuccess)
m_audit.SetOperateSuccess();
sprintf(g_strMsg, "删除数据库%s成功", strDatabaseName);
g_msg.ThrowSuccessMsg(g_strMsg);
return TRUE;
}
}
ASSERT(pos == NULL);
ASSERT(strDatabaseName.CompareNoCase(pDB->m_strDBName) != 0);
sprintf(g_strMsg, "数据库%s不存在", strDatabaseName);
g_msg.ThrowErrorMsg(g_strMsg);
//通知界面更新数据
g_msg.UpdateUser();
g_msg.UpdateRole();
g_msg.UpdateTable();
return FALSE;
}
/**********************************************************************
功能:创建新用户
***********************************************************************/
BOOL CSdbms::DoCreateUser(CString strUserName, CString strPassword, UINT nClass/*=2*/)
{
ASSERT(m_pCurUser);
//审计
BOOL bAuditSuccess = m_audit.Audit(m_pCurUser, SR_CREATE_USER, m_pCurDB);
//判断当前用户是否有权执行Create User命令
if (!HaveSystemRight(SR_CREATE_USER, m_pCurUser, NULL))
return FALSE;
CSdbms_User *pTemp;
if (GetUser(strUserName, &pTemp)) //检查用户名是否已存在
{
sprintf(g_strMsg, "用户名%s已经存在", strUserName);
g_msg.ThrowErrorMsg(g_strMsg);
return FALSE;
}
CSdbms_SecurityLevel slSecLevel;
slSecLevel.m_nClassifaction = (nClass > 3) ? 3:nClass;
slSecLevel.m_nClassifaction = (nClass < 0) ? 0:slSecLevel.m_nClassifaction;
slSecLevel.m_nRangeCount = 0;
//只有DBSA才能给用户设置新的安全级
if (!IsOwnDbsaRole(m_pCurUser->m_nUserID))
{
if (slSecLevel.m_nClassifaction != 2)
slSecLevel.m_nClassifaction = 2;
}
// m_nMaxUserID++; //创建新用户,并加入到用户链表中
CSdbms_User *pUser = new CSdbms_User(strUserName, m_nMaxUserID++, strPassword, slSecLevel);
m_UserList.AddTail(pUser);
//设置审计记录中操作成功属性为真
if (bAuditSuccess)
m_audit.SetOperateSuccess();
sprintf(g_strMsg, "创建新用户%s成功", strUserName);
g_msg.ThrowSuccessMsg(g_strMsg);
//通知界面更新数据
g_msg.UpdateUser();
return TRUE;
}
/**********************************************************************
功能:删除用户
***********************************************************************/
BOOL CSdbms::DoDropUser(CString strUserName)
{
ASSERT(m_pCurUser);
//审计
BOOL bAuditSuccess = m_audit.Audit(m_pCurUser, SR_DROP_USER, m_pCurDB);
//不能删除dba用户
if (strUserName.CompareNoCase(SYSTEM_ROLE_DBA) == 0)
{
sprintf(g_strMsg, "用户%s无权删除用户dba", m_pCurUser->m_strUserName);
g_msg.ThrowErrorMsg(g_strMsg);
return FALSE;
}
//不能删除当前用户
if (strUserName.CompareNoCase(m_pCurUser->m_strUserName) == 0)
{
sprintf(g_strMsg, "用户%s不能删除自身", m_pCurUser->m_strUserName);
g_msg.ThrowErrorMsg(g_strMsg);
return FALSE;
}
//判断当前用户是否有权执行Drop User命令
if (!HaveSystemRight(SR_DROP_USER, m_pCurUser, NULL))
return FALSE;
CSdbms_User *pUser = NULL;
POSITION prepos, pos = m_UserList.GetHeadPosition();
while (pos != NULL)
{
prepos = pos;
pUser = m_UserList.GetNext(pos);
if (strUserName.CompareNoCase(pUser->m_strUserName) == 0) //检查用户是否存在
{
m_UserList.RemoveAt(prepos); //从全局用户链表中删去该用户指针
break;
}
}
if (strUserName.CompareNoCase(pUser->m_strUserName) != 0)
{
sprintf(g_strMsg, "用户%s不存在", strUserName);
g_msg.ThrowErrorMsg(g_strMsg);
return FALSE;
}
//遍历数据库,删除用户有数据库中的相关信息
pos = m_DBList.GetHeadPosition();
while (pos != NULL)
{
CSdbms_Database *pDB = m_DBList.GetNext(pos);
if (!pDB->m_bInit) //如果DB还没初始化,要读它的数据字典进行初始化
pDB->Init();
pDB->DeleteUser(pUser);
}
//删除用户与系统预定义角色的关系
pos = m_RoleUserList.GetHeadPosition();
while (pos != NULL)
{
POSITION prepos = pos;
CSdbms_RoleUser *pRoleUser = m_RoleUserList.GetNext(pos);
if (pRoleUser->m_pUser == pUser)
{
m_RoleUserList.RemoveAt(prepos);
delete pRoleUser;
}
}
if (pUser->m_nUserID == m_nMaxUserID-1)
m_nMaxUserID--;
delete pUser; //删除用户信息
//设置审计记录中操作成功属性为真
if (bAuditSuccess)
m_audit.SetOperateSuccess();
sprintf(g_strMsg, "删除用户%s成功", strUserName);
g_msg.ThrowSuccessMsg(g_strMsg);
//通知界面更新数据
g_msg.UpdateUser();
g_msg.UpdateRole();
return TRUE;
}
/**********************************************************************
功能:为当前连接的数据库创建新的角色
***********************************************************************/
BOOL CSdbms::DoCreateRole(CString strRoleName)
{
ASSERT(m_pCurUser);
//审计
BOOL bAuditSuccess = m_audit.Audit(m_pCurUser, SR_CREATE_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);
//判断当前用户是否有权执行Create Role命令
if (!HaveSystemRight(SR_CREATE_ROLE, m_pCurUser, m_pCurDB))
return FALSE;
if (m_pCurDB->CreateRole(strRoleName))
{
//设置审计记录中操作成功属性为真
if (bAuditSuccess)
m_audit.SetOperateSuccess();
//通知界面更新数据
g_msg.UpdateRole();
return TRUE;
}
else
return FALSE;
}
/**********************************************************************
功能:从当前连接的数据库中删除一角色
***********************************************************************/
BOOL CSdbms::DoDropRole(CString strRoleName)
{
ASSERT(m_pCurUser);
//审计
BOOL bAuditSuccess = m_audit.Audit(m_pCurUser, SR_DROP_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);
//判断当前用户是否有权执行Drop Role命令
if (!HaveSystemRight(SR_DROP_ROLE, m_pCurUser, m_pCurDB))
return FALSE;
if (m_pCurDB->DropRole(strRoleName))
{
//设置审计记录中操作成功属性为真
if (bAuditSuccess)
m_audit.SetOperateSuccess();
//通知界面更新数据
g_msg.UpdateUser();
g_msg.UpdateRole();
return TRUE;
}
else
return FALSE;
}
/**********************************************************************
功能:在当前连接的数据库中设置一个角色为另一个角色的父角色
***********************************************************************/
BOOL CSdbms::DoSetParentRole(CString strParentRoleName, CString strChildRoleName)
{
ASSERT(m_pCurUser);
//审计
BOOL bAuditSuccess = m_audit.Audit(m_pCurUser, SR_SET_PARENT_ROLE, m_pCurDB);
CantUseRoleName(strChildRoleName, SYSTEM_ROLE_SYSTEM); //不能使用系统定义的角色名
CantUseRoleName(strChildRoleName, SYSTEM_ROLE_DBSA);
CantUseRoleName(strChildRoleName, SYSTEM_ROLE_DBA);
CantUseRoleName(strChildRoleName, SYSTEM_ROLE_LOGIN);
CantUseRoleName(strChildRoleName, SYSTEM_ROLE_GUEST);
CantUseRoleName(strChildRoleName, SYSTEM_ROLE_OWNER);
CantUseRoleName(strParentRoleName, SYSTEM_ROLE_SYSTEM); //不能使用系统定义的角色名
CantUseRoleName(strParentRoleName, SYSTEM_ROLE_DBSA);
CantUseRoleName(strParentRoleName, SYSTEM_ROLE_DBA);
CantUseRoleName(strParentRoleName, SYSTEM_ROLE_LOGIN);
CantUseRoleName(strParentRoleName, SYSTEM_ROLE_GUEST);
CantUseRoleName(strParentRoleName, SYSTEM_ROLE_OWNER);
//检查当前是否有连接的数据库
if (m_pCurDB == NULL)
{
g_msg.ThrowErrorMsg("当前没有数据库被打开");
return FALSE;
}
ASSERT(m_pCurDB->m_bInit && m_pCurDB->m_pRole);
//判断当前用户是否有权执行Set Parent Role命令
if (!HaveSystemRight(SR_SET_PARENT_ROLE, m_pCurUser, m_pCurDB))
return FALSE;
if (m_pCurDB->SetParentRole(strParentRoleName, strChildRoleName))
{
//设置审计记录中操作成功属性为真
if (bAuditSuccess)
m_audit.SetOperateSuccess();
//通知界面更新数据
g_msg.UpdateUser();
g_msg.UpdateRole();
return TRUE;
}
else
return FALSE;
}
/**********************************************************************
功能:在当前连接的数据库中设置一个角色为另一个角色的子角色
***********************************************************************/
BOOL CSdbms::DoSetChildRole(CString strParentRoleName, CString strChildRoleName)
{
ASSERT(m_pCurUser);
//审计
BOOL bAuditSuccess = m_audit.Audit(m_pCurUser, SR_SET_CHILD_ROLE, m_pCurDB);
CantUseRoleName(strParentRoleName, SYSTEM_ROLE_SYSTEM); //不能使用系统定义的角色名
CantUseRoleName(strParentRoleName, SYSTEM_ROLE_DBSA);
CantUseRoleName(strParentRoleName, SYSTEM_ROLE_DBA);
CantUseRoleName(strParentRoleName, SYSTEM_ROLE_LOGIN);
CantUseRoleName(strParentRoleName, SYSTEM_ROLE_GUEST);
CantUseRoleName(strParentRoleName, SYSTEM_ROLE_OWNER);
CantUseRoleName(strChildRoleName, SYSTEM_ROLE_SYSTEM); //不能使用系统定义的角色名
CantUseRoleName(strChildRoleName, SYSTEM_ROLE_DBSA);
CantUseRoleName(strChildRoleName, SYSTEM_ROLE_DBA);
CantUseRoleName(strChildRoleName, SYSTEM_ROLE_LOGIN);
CantUseRoleName(strChildRoleName, SYSTEM_ROLE_GUEST);
CantUseRoleName(strChildRoleName, SYSTEM_ROLE_OWNER);
//检查当前是否有连接的数据库
if (m_pCurDB == NULL)
{
g_msg.ThrowErrorMsg("当前没有数据库被打开");
return FALSE;
}
ASSERT(m_pCurDB->m_bInit && m_pCurDB->m_pRole);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -