精华内容
下载资源
问答
  • linux 数据库表格创建

    千次阅读 2018-04-17 10:05:11
    报错信息: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''lrs_audit_rule_package'( ' id ' ...

    在MySQL命令行使用sql语句进行建表时,MySQL 报错,这个问题之前遇到过几次,但是总是会因为疏忽又相遇,今天把这个问题写出来,加深印象吧。

    sql语句:

    CREATE TABLE 'lrs_audit_rule_package'(
      'id' BIGINT(20) AUTO_INCREMENT PRIMARY KEY COMMENT '主键',
      'package_code' varchar(6)  NOT NULL COMMENT '规则包',
      'package_type' varchar(2)  NOT NULL COMMENT '规则包类型',
      'package_desc' varchar(100)  COMMENT '描述',
      'create_time' datetime DEFAULT NULL COMMENT '创始时间',
      'modified_time' datetime DEFAULT NULL COMMENT '修改时间'
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='审核规则包';
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    看上去这条sql语句确实没毛病,但是运行起来就是报错 
    报错信息:

    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''lrs_audit_rule_package'(
      'id' BIGINT(20) AUTO_INCREMENT PRIMARY KEY COMMENT ' at line 1
    • 1
    • 2

    其实这个问题就是语法上的错误,在MySQL中,为了区分MySQL的关键字与普通字符,MySQL引入了一个反引号。 
    详情见:https://dev.mysql.com/doc/refman/5.5/en/keywords.html

    在上述的sql语句中,列名称使用的是单引号而不是反引号,所以会就报了这个错误出来。修改后

    CREATE TABLE `lrs_audit_rule_package`(
      `id` BIGINT(20) AUTO_INCREMENT PRIMARY KEY COMMENT '主键',
      `package_code` varchar(6)  NOT NULL COMMENT '规则包',
      `package_type` varchar(2)  NOT NULL COMMENT '规则包类型',
      `package_desc` varchar(100)  COMMENT '描述',
      `create_time` datetime DEFAULT NULL COMMENT '创始时间',
      `modified_time` datetime DEFAULT NULL COMMENT '修改时间'
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='审核规则包';
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    再次运行就不会报错了,但是有一点需要注意,后面列的注释不能用反引号,因为这只是一个普通字符串,不是MySQL的关键字。

    在英文键盘输入环境下,按图示按钮输入反引号 `

    这里写图片描述

    展开全文
  • 在数据库服务端,添加一个表格,然后在MFC中对数据库表格的数据做插入、删除和修改
    _variant_t类
    Name.vt==VT_NULL  判断当前字段是否为空。
    CONVERT(NVARCHAR(4000),名字)='%s'" 转换一个字段的格式
    数据库插入的语句
    INSERT INTO 表格(字段1,字段2,字段3,字段4)VALUES(值1,值2,值3,值4)
    例如:TempSearch1.Format(_T("INSERT INTO 联系表(名字,卡号,电话号码,部门)VALUES('%s','%s','%s','%s')"),name,card,number,apartment);
    将联系表中插入一行,字段含有名字,卡号,电话号码,部门。注意使用连接对象的Execute的方法,这个方法的第一参数属于com接口类型其类型属于_bstr_t类,使用这个类就可以方便的把C++类型变量转换成COM中的变量了。TempSearch1属于c++中的CString类型。还有要注意的是,CString的Format方法中使用sql语句,要格式化的字符串,必须加上单引号,如果格式化字串的时候,不需要添加。
    数据库查询的语句
    select * from 表格 where 名字=某某
    例如:select * from 联系表 where CONVERT(NVARCHAR(4000),名字)='%s'"), Temp)
    从数据表中查找出名字等于Temp的字段。这里的CONVERT是做一个类型转换的功能。
    CONVERT(data_type(length),data_to_be_converted,style)
    data_type(length) 规定目标数据类型(带有可选的长度)。data_to_be_converted 含有需要转换的值。style 规定日期/时间的输出格式。


    数据库更改的语句(主要是更改字段的内容)
    UPDATE 表格 SET 字段1=值1,字段2=值2,字段3=值3,字段4=值4 where 字段1=值1
    例如: TempSearch1.Format(_T("UPDATE 联系表 SET 名字='%s',卡号='%s',电话号码='%s',部门='%s' where CONVERT(NVARCHAR(4000),名字)='%s'"),dlg. m_al_name,dlg. 
    m_al_card,dlg.m_al_phone,dlg.m_al_apartment,Temp);
    将联系表中名字temp的值做修改。可以修改里面的名字,卡号,电话号码,部门中的任意字段。
    数据库的删除功语句
    DELETE FROM  表格 where 字段1=值1
    例如:TempSearch.Format(_T("DELETE FROM 联系表 where CONVERT(NVARCHAR(4000),名字)='%s'"), Temp);
    删除联系表中名字等于Temp,一行的数据
    在数据库服务端,添加一个表格,然后在MFC中对数据库表格的数据做插入、删除和修改
    ADO中的三个对象可以对数据库的数据做修改,这里只用用连接,和记录集对象
    ADO属于OLEDB,OLEDB使用的com组件接口,所以使用ADO的时候要先初始化COM口,函数 CoInitialize(NULL);初始化后要记得卸载COM口,函数 CoUninitialize();
    Connection对象是这三个对象的基础,它的主要作用是建立与数据库的连接,建立了与数据库的连接后,才能进行其它有关数据库的访问和操作。也就是说,使用ADO操作数据库,通常先用Connection对象的Open方法打开一个库连接,然后才能进行数据库的操作。操作完成后,要关闭这个库连接。
    具体步骤如下:
    第一步
    需要囊括ADO的文件:#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF") 放在StdAfx.h中关于各种include的描述之后。这句话中#import的意思是引入,后面使用了rename为了避免类型库文件中的EOF和系统文件的EOF重名。
    第二步
    在修改初始化函数前,添加对话框,在新增两个对话框,添加和修改对话框,对话框上分别添加四个静态文本其caption改为姓名、卡号、电话号码、部门 ,和四个编辑框,分别为添加和修改对话框新增一个相关联的对话框类,方便后续添加和修改时用到这两个对话框,主对话框中也增加和修改一样的四个静态文本,五个编辑文本,五个按键,按键的值分别为add add1,update,search ,delete。
    在OnInitDialog中初始化COM口,连接数据库。在初始化对话框之前连接上数据库,以后其他按键里面进行操作,就不必重复连接。定义m_pConnection 、m_pRecordset和 m_strConnect为dlg类的类成员函数,其变量类型分别为_ConnectionPtr、 _RecordsetPtr 和 _bstr_t
    BOOL CdatabaseconnectDlg::OnInitDialog()
    {......
    CoInitialize(NULL);
     m_strConnect= _bstr_t("Driver=SQL Server;SERVER=172.16.1.251;Database=rita;uid=sa;pwd=sa");
     BOOL ret=0;
     try
     {
    ret = m_pConnection.CreateInstance(_uuidof(Connection));///创建Connection实例
     if(!ret)
     {
    m_pConnection->ConnectionTimeout = 3;
    ret = m_pConnection->Open( m_strConnect,"", "", adModeUnknown);
     }


     }
     catch(_com_error e)///捕捉异常
     {
    CString errormessage;
    errormessage.Format( _T("连接数据库失败!\r\n错误信息:%s"),e.ErrorMessage());
    AfxMessageBox(errormessage);///显示错误信息
     }
     CoUninitialize();
    return TRUE;  
      }
    在初始化对话框的时候,打开数据库连接
    编写查询的函数,点击search选单,里面添代码如下:
    {
    // TODO: 在此添加控件通知处理程序代码
    CString TempSearch;
    CString Temp;
    GetDlgItemText(IDC_SEARCH,Temp);  //得到这个编辑框控件的值
    TempSearch.Format(_T("select * from 联系表 where CONVERT(NVARCHAR(4000),名字)='%s'"), Temp);         查找名字为Temp的所有行数据
    if (!m_pConnection->State )
    {
    AfxMessageBox(_T("请先连接数据库"));///显示错误信息
    }
    try
    {
    m_pRecordset.CreateInstance("ADODB.Recordset");
    m_pRecordset->Open(  _bstr_t(TempSearch),   //通过记录集的方法来查询数据集   
    _variant_t((IDispatch*)m_pConnection,true),
    adOpenStatic,
    adLockOptimistic,
    adCmdText);
    }
    catch(_com_error &e)


    {
    AfxMessageBox(e.Description());
    }


    _variant_t Name,CardNumber,PhoneNumber,Department;
    try
    {
    while(!m_pRecordset->rsEOF)          //while循环在表中不停的查找要查找的字段
    {Name=m_pRecordset->GetCollect( "名字");


    CardNumber=m_pRecordset->GetCollect("卡号");


    PhoneNumber=m_pRecordset->GetCollect("电话号码");


    Department=m_pRecordset->GetCollect("部门");


    CString strtemp;
    if(Name.vt!=VT_NULL)     //判断数据库中值是否为空
    {
    strtemp.Format( _T("%s"),Name.lVal);
    }
    else
    {
    strtemp.Format( _T(""),Name.lVal);
    }
    SetDlgItemText(IDC_NAME, strtemp );
    if(CardNumber.vt!=VT_NULL)
    {
    strtemp.Format( _T("%s"),CardNumber.lVal);
    }
    else
    {
    strtemp.Format( _T(""),Name.lVal);
    }
    SetDlgItemText(IDC_CARD, strtemp );


    if(PhoneNumber.vt!=VT_NULL)
    {
    strtemp.Format( _T("%s"),PhoneNumber.lVal);
    }
    else
    {
    strtemp.Format( _T(""),Name.lVal);
    }
    SetDlgItemText(IDC_PHONE, strtemp );


    if(Department.vt!=VT_NULL)
    {
    strtemp.Format( _T("%s"),Department.lVal);
    }
    else
    {
    strtemp.Format( _T(""),Name.lVal);
    }
    SetDlgItemText(IDC_APARTMENT, strtemp );
    m_pRecordset->MoveNext();
    }
    }
    catch(_com_error &e)
    {
    AfxMessageBox(e.Description());
    }
    m_pRecordset->Close();
    m_pRecordset.Release();
    }


    调用字符集对象后一定要close和relea字符集
    编写添加的函数,点击add选单,里面添代码如下:
    这里添加数据库,通过点击按钮弹出对话框来实现。


    void CdatabaseconnectDlg::OnBnClickedadd1()
    {
    CString TempSearch;
    CString Temp;


    CString   local_name;

    GetDlgItemText(IDC_SEARCH,Temp);
    TempSearch.Format(_T("select * from 联系表 where CONVERT(NVARCHAR(4000),名字)='%s'"), Temp);
    if (!m_pConnection->State )
    {
    AfxMessageBox(_T("请先连接数据库"));///显示错误信息
    }
    try
    {
    m_pRecordset.CreateInstance("ADODB.Recordset");
    m_pRecordset->Open(  _bstr_t(TempSearch),
    _variant_t((IDispatch*)m_pConnection,true),
    adOpenStatic,
    adLockOptimistic,
    adCmdText);
    }
    catch(_com_error &e)


    {
    AfxMessageBox(e.Description());
    }


    _variant_t Name,CardNumber,PhoneNumber,Department;
    try
    {
    while(!m_pRecordset->rsEOF)
    {Name=m_pRecordset->GetCollect( "名字");


    CardNumber=m_pRecordset->GetCollect("卡号");


    PhoneNumber=m_pRecordset->GetCollect("电话号码");


    Department=m_pRecordset->GetCollect("部门");


    CString strtemp;
    if(Name.vt!=VT_NULL)
    {
    strtemp.Format( _T("%s"),Name.lVal);
    }
    else
    {
    strtemp.Format( _T(""),Name.lVal);
    }
    SetDlgItemText(IDC_NAME, strtemp );
    local_name=strtemp;
    if(CardNumber.vt!=VT_NULL)
    {
    strtemp.Format( _T("%s"),CardNumber.lVal);
    }
    else
    {
    strtemp.Format( _T(""),Name.lVal);
    }
    SetDlgItemText(IDC_CARD, strtemp );

    if(PhoneNumber.vt!=VT_NULL)
    {
    strtemp.Format( _T("%s"),PhoneNumber.lVal);
    }
    else
    {
    strtemp.Format( _T(""),Name.lVal);
    }
    SetDlgItemText(IDC_PHONE, strtemp );

    if(Department.vt!=VT_NULL)
    {
    strtemp.Format( _T("%s"),Department.lVal);
    }
    else
    {
    strtemp.Format( _T(""),Name.lVal);
    }
    SetDlgItemText(IDC_APARTMENT, strtemp );
    m_pRecordset->MoveNext();


    }


    }
    catch(_com_error &e)
    {
    AfxMessageBox(e.Description());
    }


    CString name;
    CString card;
    CString number;
    CString apartment;
    CString TempSearch1;
    _variant_t RecordsAffected;
    GetDlgItemText(IDC_NAME,name);
    GetDlgItemText(IDC_CARD,card);
    GetDlgItemText(IDC_PHONE,number);
    GetDlgItemText(IDC_APARTMENT,apartment);
    TESTDLG dlg;
    CString TempSearch2;
      _variant_t RecordsAffected1; 
    if(dlg.DoModal()!=IDOK)        //判断是否获得图片

    return ;
    }



    if (!m_pConnection->State )
    {
    AfxMessageBox(_T("请先连接数据库"));///显示错误信息
    }
    if(local_name==dlg.m_name1)   //将查找的值与对话框中的值进行比较,如果相同就弹出提示消息
    {
    AfxMessageBox(_T("名字重复,不许添加"));
    return;
    }
    try  
    {  


    TempSearch2.Format(_T("INSERT INTO 联系表(名字,卡号,电话号码,部门)VALUES('%s','%s','%s','%s')"),dlg.m_name1,dlg.m_card1,dlg.m_phone1,dlg.m_apartment1);


    bstr_t  strCmd;
    strCmd=( bstr_t)TempSearch2;
    m_pConnection->Execute(strCmd,&RecordsAffected1,adCmdText);  
    }  
    catch(_com_error &e)  
    {  
    AfxMessageBox(e.Description());  
    }  


    m_pRecordset->Close();
    m_pRecordset.Release();

    }


    首先要先查找当前数据库里面的所有信息,如果检查到当前数据库里面名字字段和添加的字段相同就不允许添加。
    之前新建了增加了添加对话框的类,添加类的变量分别于对话框中的四个控件相关联,控件的值相关联,其值为m_name1,m_card1,m_phone1,m_apartment1,当点击添加按钮后,弹出添加的对话框,在对话框上的四个编辑框分别输入值后,使用sql中的插入语句将其值写入到数据库表格中,在dlg.DoModal==IDOK是将添加的对话框弹出,如果在这个对话框中点击确定按钮的话,对话框销毁,再去用GetDlgItemText函数,读不到对话框控件上的值,所以将控件的值与对话框类关联起来,当按对话框退出后,与对话框相关联的类的成员变量的值不会被销毁,用SQL的插入语句,将其值写入到数据库中。
    编写修改的函数,点击update选单,里面添代码如下:
    void CdatabaseconnectDlg::OnBnClickedUpdate()
    {
    // TODO: 在此添加控件通知处理程序代码



    CString TempSearch;
    _variant_t RecordsAffected;
    CString name;
    CString card;
    CString number;
    CString apartment;

    CString Temp;
    GetDlgItemText(IDC_SEARCH,Temp);
    TempSearch.Format(_T("select * from 联系表 where CONVERT(NVARCHAR(4000),名字)='%s'"), Temp);
    if (!m_pConnection->State )
    {
    AfxMessageBox(_T("请先连接数据库"));///显示错误信息
    }
    try
    {
    m_pRecordset.CreateInstance("ADODB.Recordset");
    m_pRecordset->Open(  _bstr_t(TempSearch),
    _variant_t((IDispatch*)m_pConnection,true),
    adOpenStatic,
    adLockOptimistic,
    adCmdText);
    }
    catch(_com_error &e)


    {
    AfxMessageBox(e.Description());
    }


    _variant_t Name,CardNumber,PhoneNumber,Department;
    try
    {
    while(!m_pRecordset->rsEOF)
    {Name=m_pRecordset->GetCollect( "名字");


    CardNumber=m_pRecordset->GetCollect("卡号");


    PhoneNumber=m_pRecordset->GetCollect("电话号码");


    Department=m_pRecordset->GetCollect("部门");


    CString strtemp;
    if(Name.vt!=VT_NULL)
    {
    strtemp.Format( _T("%s"),Name.lVal);
    }
    else
    {
    strtemp.Format( _T(""),Name.lVal);
    }
    SetDlgItemText(IDC_NAME, strtemp );
    name = strtemp;
    if(CardNumber.vt!=VT_NULL)
    {
    strtemp.Format( _T("%s"),CardNumber.lVal);
    }
    else
    {
    strtemp.Format( _T(""),Name.lVal);
    }
    SetDlgItemText(IDC_CARD, strtemp );
    card = strtemp;
    if(PhoneNumber.vt!=VT_NULL)
    {
    strtemp.Format( _T("%s"),PhoneNumber.lVal);
    }
    else
    {
    strtemp.Format( _T(""),Name.lVal);
    }
    SetDlgItemText(IDC_PHONE, strtemp );
    number= strtemp;


    if(Department.vt!=VT_NULL)
    {
    strtemp.Format( _T("%s"),Department.lVal);
    }
    else
    {
    strtemp.Format( _T(""),Name.lVal);
    }
    SetDlgItemText(IDC_APARTMENT, strtemp );
      apartment= strtemp;


    m_pRecordset->MoveNext();


    }


    }
    catch(_com_error &e)
    {
    AfxMessageBox(e.Description());
    }


    ALTER dlg;
    dlg.m_al_name=name;
    dlg. m_al_card=card;
    dlg.m_al_phone=number;
    dlg.m_al_apartment=apartment;
    CString   TempSearch1;
    if(dlg.DoModal()==IDOK)        //判断是否获得图片
    { TempSearch1.Format(_T("UPDATE 联系表SET 名字='%s',卡号='%s',电话号码='%s',部门='%s' where CONVERT(NVARCHAR(4000),名字)='%s'"),dlg. m_al_name,dlg. m_al_card,dlg.m_al_phone,dlg.m_al_apartment,Temp);
    }


    if (!m_pConnection->State )
    {
    AfxMessageBox(_T("请先连接数据库"));///显示错误信息
    }

    try  
    {  
    _bstr_t strCmd=TempSearch1;
    m_pConnection->Execute(strCmd,&RecordsAffected,adCmdText);  
    }  
    catch(_com_error &e)  
    {  
    AfxMessageBox(e.Description());  
    }  



    m_pRecordset->Close();
    m_pRecordset.Release();

    }
    和添加函数一样要注意当一个对话框销毁后,就不能读到其对话框控件的值,只有在这之前将对话框控件的值与类的成员变量相关联。
    编写删除的函数,点击deltete选单,里面添代码如下:
       void CdatabaseconnectDlg::OnBnClickedDel()
    {
    // TODO: 在此添加控件通知处理程序代码

       _variant_t RecordsAffected; 
    CString TempSearch;
    CString Temp;
    GetDlgItemText(IDC_SEARCH,Temp);


    if (!m_pConnection->State )
    {
    AfxMessageBox(_T("请先连接数据库"));///显示错误信息
    }


    try  
    {  

    TempSearch.Format(_T("DELETE FROM 联系表 where CONVERT(NVARCHAR(4000),名字)='%s'"), Temp);

    bstr_t  strCmd;
    strCmd=( bstr_t)TempSearch;
    m_pConnection->Execute(strCmd,&RecordsAffected,adCmdText);  
    }  
    catch(_com_error &e)  
    {  
    AfxMessageBox(e.Description());  
    }  
    SetDlgItemText(IDC_NAME,NULL);
    SetDlgItemText(IDC_CARD,NULL);
    SetDlgItemText(IDC_PHONE,NULL);
    SetDlgItemText(IDC_APARTMENT,NULL);


    }
        


    还有一个值得注意的地方时,查找的时候字段一段要和新建表格的字段相匹配。strtemp.Format( _T("%s"),CardNumber.lVal); 这个一定是%s,新建表格的时候,这个字段为nchar类型。不能谢伟%d.不能再编辑框中显示就会出问题。
























    展开全文
  • 业务系统中用户权限数据库表格的设计 (2012-06-02 15:12:40) 转载▼ 标签: 杂谈 分类:数据库分析 实现业务系统中的用户权限管理--设计篇  B/S系统中的权限比C/S中的更显的重要,C...

    业务系统中用户权限数据库表格的设计

    (2012-06-02 15:12:40)
    标签:

    杂谈

    分类:数据库分析
    实现业务系统中的用户权限管理--设计篇
      B/S系统中的权限比C/S中的更显的重要,C/S系统因为具有特殊的客户端,所以访问用户的权限检测可以通过客户端实现或通过客户端+服务器检测实现,而B/S中,浏览器是每一台计算机都已具备的,如果不建立一个完整的权限检测,那么一个非法用户很可能就能通过浏览器轻易访问到B/S系统中的所有功能。因此B/S业务系统都需要有一个或多个权限系统来实现访问权限检测,让经过授权的用户可以正常合法的使用已授权功能,而对那些未经授权的非法用户将会将他们彻底的拒之门外。下面就让我们一起了解一下如何设计可以满足大部分B/S系统中对用户功能权限控制的权限系统。
    需求陈述不同职责的人员,对于系统操作的权限应该是不同的。优秀的业务系统,这是最基本的功能。
    • 可以对进行权限分配。对于一个大企业的业务系统来说,如果要求管理员为其下员工逐一分配系统操作权限的话,是件耗时且不够方便的事情。所以,系统中就提出了对进行操作的概念,将权限一致的人员编入同一组,然后对该组进行权限分配。
    • 权限管理系统应该是可扩展的。它应该可以加入到任何带有权限管理功能的系统中。就像是组件一样的可以被不断的重用,而不是每开发一套管理系统,就要针对权限管理部分进行重新开发。
    • 满足业务系统中的功能权限。传统业务系统中,存在着两种权限管理,其一是功能权限的管理,而另外一种则是资源权限的管理,在不同系统之间,功能权限是可以重用的,而资源权限则不能。
    关于设计
      借助NoahWeb的动作编程理念,在设计阶段,系统设计人员无须考虑程序结构的设计,而是从程序流程以及数据库结构开始入手。为了实现需求,数据库的设计可谓及其重要,无论是操作的概念,还是整套权限管理系统的重用性,都在于数据库的设计。
    我们先来分析一下数据库结构:
      首先,action表(以下简称为权限表),gorupmanager表(以下简称为管理组表),以及master表(以下简称为人员表),是三张实体表,它们依次记录着权限的信息,管理组的信息和人员的信息。如下图:
      这三个表之间的关系是多对多的,一个权限可能同时属于多个管理组,一个管理组中也可能同时包含多个权限。同样的道理,一个人员可能同时属于多个管理组,而一个管理组中也可能同时包含多个人员。如下图:
      由于这三张表之间存在着多对多的关系,那么它们之间的交互,最好使用另外两张表来完成。而这两张表起着映射的作用,分别是“actiongroup”(以下简称权限映射表“mastergroup”(以下简称人员映射表,前者映射了权限表与管理组表之间的交互。后者映射了人员表与管理组表之间的交互。如下图:
      另外,还需要一张表来控制系统运行时左侧菜单中的权限分栏,也就是权限分栏表,如下图:
      根据上面的分析,我们进行数据库结构设计,如下图:
      为了能够进行良好的分析,我们将数据库结构图拆分开来,三张实体表的作用已经很清晰,现在我们来看一下两张映射表的作用。
    权限映射表如下图:
      首先,我们来了解一下权限映射表管理组表以及权限表之间的字段关联。
      看图中的红圈,先看gorupid字段相关联,这种关联方式在实际数据库中的表现如下图:
      如图中所示,管理组表超级管理员groupid1,那么权限映射表groupid1的权限也就是超级管理员所拥有的权限。
      使用groupid字段关联,是为了查到一个管理组能够执行的权限有哪些。但这些权限的详细信息却是action字段关联所查询到的。
      action字段相关联在数据库中的表现如下图:
      通过这种关联,才查询到权限映射表之中那些权限的详细信息。综合起来,我们就知道了一个管理组可以执行的权限有哪些,以及这些权限的详细信息是什么。
      或许你会问,为什么不使用actionid字段相关联呢?因为:
    • 权限表中的id字段在经过多次的数据库操作之后可能会发生更改。
    • 权限映射表中仅仅记录着一个管理组可以执行的权限。
    • 一旦权限表中的id更改,那么权限映射表中的记录也就更改了。
    • 一个管理组可以执行的权限势必将出错,这是非常不希望的。
      考虑到上面的情况,所以应该使用action字段相关联,因为:
    • 权限表中,id可能发生变化,而action字段却是在任何情况下也不可能发生变化的。
    • 权限映射表中记录的action字段也就不会变。
    • 一个管理组可以执行的权限就不会出错了。
    人员映射表如下图:
      我们来了解一下人员映射表管理组表以及人员表之间的字段关联,如下图:
      看图中的红圈部分,先看groupid字段关联,这种关联方式在数据库中的表现如下图:
      如图,超级管理员组的groupid1,我们再看人员映射表admin属于超级管理员组,而administrator属于超级管理员组,同时也属于管理员组。
      使用这种关联方式,是为了查到一个管理组中的人员有谁。和上面一样,人员的详细信息是靠id字段(人员映射表中是masterid字段)关联查询到的。
      id字段(人员映射表中是masterid字段)关联表现在数据库中的形式如下图:
      一个人员可能同时属于多个管理组,如图中,administrator就同时属于两个管理组。所以,在人员映射表中关于administrator的记录就会是两条。
      这种关联方式才查询到管理组中人员的详细信息有哪些。综合起来,才可以知道一个管理组中的人员有谁,以及这个人员的详细信息。
      再结合上面谈到的权限表权限映射表,就实现了需求中的操作,如下图:
      其实,管理组表中仅仅记录着组的基本信息,如名称,组id等等。至于一个组中人员的详细信息,以及该组能够执行的权限的详细信息,都记录在人员表权限表中。两张映射表才真正记录着一个组有哪些人员,能够执行哪些权限。通过两张映射表的衔接,三张实体表之间的交互才得以实现,从而完成了需求中提到的操作
      我们再来看一下权限分栏表权限表之间的交互。这两张表之间的字段关联如下图:
      两张表使用了actioncolumnid字段相关联,这种关联方式在数据库中的表现如下图:
      如图所示,通过这种关联方式,我们可以非常清晰的看到权限表中的权限属于哪个分栏。
      现在,数据库结构已经很清晰了,分配权限的功能以及操作都已经实现。下面我们再来分析一下需求中提到的关于权限管理系统的重用性问题。
      为什么使用这种数据库设计方式搭建起来的系统可以重用呢?
    • 三张实体表中记录着系统中的三个决定性元素。权限。而这三种元素可以任意添加,彼此之间不受影响。无论是那种类型的业务系统,这三个决定性元素是不会变的,也就意味着结构上不会变,而变的仅仅是数据。
    • 两张映射表中记录着三个元素之间的关系。但这些关系完全是人为创建的,需要变化的时候,只是对数据库中的记录进行操作,无需改动结构。
    • 权限分栏表中记录着系统使用时显示的分栏。无论是要添加分栏,修改分栏还是减少分栏,也只不过是操作记录而已。
      综上所述,这样设计数据库,系统是完全可以重用的,并且经受得住变更考验的。
    总结:
      此套系统的重点在于,三张实体表牢牢地抓住了系统的核心成分,而两张映射表完美地映射出三张实体表之间的交互。其难点在于,理解映射表的工作,它记录着关系,并且实现了操作的概念。而系统总体的设计是本着可以在不同的MIS系统中重用来满足不同系统的功能权限设置。
    附录:
    权限管理系统数据表的字段设计
      下面我们来看看权限管理系统的数据库表设计,共分为六张表,如下图:
    action表:
      action表中记录着系统中所有的动作,以及动作相关描述。
    actioncolumn表:
      actioncolumn表中记录着动作的分栏,系统运行时,左侧菜单栏提供了几块不同的功能,每一块就是一个分栏,每添加一个分栏,该表中的记录就会增加一条,相对应的,左侧菜单栏中也会新增机一个栏。
    actiongroup表:
      actiongroup表记录着动作所在的组。
    groupmanager表:
      groupmanager表记录着管理组的相关信息,每添加一个管理组,这里的记录就会增加一条。
    mastergroup表:
      mastergroup表记录着管理员所在的管理组,由于一名管理员可能同同时属于多个组,所以该表中关于某一名管理员的记录可能有多条。
    master表:
      master表记录着所有管理员的信息,每添加一个管理员,该表就会增加一条记录。
    展开全文
  • MySQL生成数据库设计表格

    千次阅读 2019-10-28 11:52:25
    查询单个 指定数据库数据库表 SET @db_name = 'test'; SET @table_name = 'sys_user'; SELECT COLUMN_NAME 字段名称, COLUMN_TYPE 字段类型, IF ( COLUMN_NAME IN ( SELECT COLUMN_NAME FROM information_...

    查询单个 指定数据库和数据库表

    SET @db_name = 'test';
    
    SET @table_name = 'sys_user';
    SELECT
    	COLUMN_NAME 字段名称,
    	COLUMN_TYPE 字段类型,
    IF
    	(
    		COLUMN_NAME IN ( SELECT COLUMN_NAME FROM information_schema.KEY_COLUMN_USAGE AS T WHERE T.table_schema = @db_name AND T.table_name = @table_name ),
    		'PRIMARY KEY',
    	IF
    		( IS_NULLABLE = 'NO', 'NOT NULL', 'NULL' )
    	) AS 字段约束,
    	COLUMN_COMMENT 字段注释
    FROM
    	INFORMATION_SCHEMA.COLUMNS
    WHERE
    	table_schema = @db_name
    	AND table_name = @table_name;
    

    查询多个 指定数据库

    SET @db_name = 'test';
    SELECT
    	CONCAT( 'SELECT COLUMN_NAME 字段名称, COLUMN_TYPE 字段类型, IF ( COLUMN_NAME IN ( SELECT COLUMN_NAME FROM information_schema.KEY_COLUMN_USAGE AS T WHERE T.table_schema = \'', @db_name, '\' AND T.table_name = \'', table_name, '\' ), \'PRIMARY KEY\', IF ( IS_NULLABLE = \'NO\', \'NOT NULL\', \'NULL\' ) ) AS 字段约束, COLUMN_COMMENT 字段注释 FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema = \'', @db_name, '\' AND table_name = \'', table_name, '\';' )
    FROM
    	information_schema.TABLES
    WHERE
    	table_schema = @db_name;
    

    但是还不够方便 如下为使用EXECUTE执行GROUP_CONCAT拼接的OUTFILE语句直接输出到文件
    PS: 搞了好长时间 主要是修改配置文件和一些报错

    SET @db_name = 'test';
    SELECT
    	@SQL := CONCAT(
    		'SELECT * INTO OUTFILE \'/data/all.xlsx\' FIELDS TERMINATED BY \'\t\' FROM (',
    		GROUP_CONCAT(
    			CONCAT( 'SELECT \'表名 -> ', table_name, '\' AS 字段名称, \'描述 -> ',table_comment,'\' AS 字段类型, \'+\' AS 字段约束, \'-\' AS 字段注释 UNION ALL SELECT COLUMN_NAME, COLUMN_TYPE, IF ( COLUMN_NAME IN ( SELECT COLUMN_NAME FROM information_schema.KEY_COLUMN_USAGE AS T WHERE T.table_schema = \'', @db_name, '\' AND T.table_name = \'', table_name, '\' ), \'PRIMARY KEY\', IF ( IS_NULLABLE = \'NO\', \'NOT NULL\', \'NULL\' ) ), COLUMN_COMMENT FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema = \'', @db_name, '\' AND table_name = \'', table_name, '\'' ) SEPARATOR ' UNION ALL '
    		),
    		') a'
    	)
    FROM
    	information_schema.TABLES
    WHERE
    	table_schema = @db_name # 此处条件可自行修改
    	AND table_name NOT LIKE '%act_%';
    PREPARE _sql
    FROM
    	@SQL;
    EXECUTE _sql;
    

    如下配置生效要重启mysql服务 systemctl restart mysql

    ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
    需要配置secure-file-priv 编辑mysql的my.cnf在[mysqld]修改或添加 无[mysqld]请手动创建
    secure-file-priv为null(默认值) 不允许导入|导出
    secure_file_priv为/data 导入|导出只能发生在/tmp/目录下
    secure_file_priv没有值 表示不对导入|导出做限制

    Can’t create/write to file ‘/data/text.csv’ (Errcode: 13 - Permission denied)
    说明没有权限操作 好像是上面的配置没有全部生效 通过设置tmpdir可解决 有更好的解决方式我在更新
    tmpdir = /data # 同样是在[mysqld]下修改或增加

    如果最后显示的sql语句不全可能是GROUP_CONCAT的限制太小 有的人说设为-1为无限制 但是我的还是显示不全
    group_concat_max_len=99999 # 同样是在[mysqld]下修改或增加

    Duplicate column name ‘xxxx’ 别名重复 重复字段名称起个别名即可


    结果图如下
    结果图

    展开全文
  • shiro实现粗细粒度权限控制一:表格设计   一:表格设计(一个用户对应一个系统角色,一个系统角色具有多个操作权限)   分析本系统中 用户、角色、权限之间关系: 一个用户对应一个角色(一对一关系) tip:...
  • 转载自 添加链接描述,针对对自己遇到的坑做了些许修改 from django.http import HttpResponse from xlwt import * from StringIO import StringIO #需要stringIO,这是python2中的,如果是python3,使用 from io...
  • 数据库的元信息:首先介绍一下数据库的元信息(元数据):元数据(Metadata)是关于数据的数据。元数据是描述数据仓库内数据的结构和建立方法的数据。存储的数据是什么类型,什么驱动等等,这些描述数据的数据,就是元...
  • 使用itext将数据库表格转为Pdf文件

    千次阅读 2018-06-25 00:24:42
    上一篇博客讲到了如何将mysql数据库中的数据转出为Excel文件,这次尝试了以下将mysql中的表格转为Pdf文件。一,创建一个java工程,名叫ReadDatabasePDF,并且导入itextpdf和mysql的相关jar包:二、创建一个类名叫...
  • 如何为数据库,表等对象添加描述信息--创建实例数据库testcreate database test --为test数据库添加拓展属性USE test;GOEXEC sys.sp_addextendedproperty @name = N
  • SQL语句查询数据库所有表和所有字段的详细信息(包括表描述和字段描述),从网上搜来,自己完善了一些,添加了表的描述信息(MS_Description),在MSSMS执行通过。供参考。 SELECT (case when a.colorder=1 ...
  • 数据库设计时的一张表格

    千次阅读 2012-01-30 09:24:25
    数据库设计时的一张表格 1)关于数据库设计规范  作为企业级应用开发,数据库表结构的设计已经是我们必须掌握的一项基本技能。但是,每个程序员对数据库的设计理解都不尽相同,为了项目的维护也为了节省开发时间...
  • 本文主要描述,Springboot-mybatis框架下上传excel,并将之导入mysql数据库的过程,如果用户id已存在,则进行更新修改数据库中该项信息,由于用到的是前后端分离技术,这里记录的主要是后端java部分,通过与前端接口...
  • 事件描述 解决过程 问题汇总 1.事件描述 要写入数据库的只有一个...表格示例 数据库示例 2.解决过程 (1)载入包并连接数据库 import pymysql #python3 连接数据库使用pymysql import openpyxl #o...
  • --查询字段类型与名称描述 select a.Table_name,a.column_name,a.data_type,a.data_length,a.data_precision,a.nullable,a.column_id,b.comments from user_tab_columns a left join user_col_comments b on a.TABLE...
  • 问题描述 这一篇讲到的问题是上一篇文章的下半部分。上一篇已经把数据存储到数据库中了,本篇文章将要实现: 1.servlet从数据库中读取数据并存为JavaBean对象,插入到list中,然后将list插入到session,将请求转发到...
  • java程序读取excel表格并存入mysql数据库详细教程

    千次阅读 多人点赞 2019-08-31 15:13:34
    Apache POI是Apache软件基金会的开放源码函式库,POI提供APIJava程序对Microsoft Office格式档案读和写的功能。 HSSF - 提供读写Microsoft Excel格式档案的功能。 XSSF - 提供读写Microsoft Excel OOXML格式档案...
  • 数据库课设之学生信息管理系统

    万次阅读 多人点赞 2019-07-13 17:31:10
    数据库课设之学生信息管理系统 一、系统需求分析 学校每年都有新生入学、老生毕业,还有其他各种人事变动。如何有效地管理这些学生 的信息,帮助学校和老师掌握学生的情况,这就是学生信息管理系统需要完成的功能。 ...
  • Hive元数据库介绍及信息查看

    万次阅读 2017-06-14 23:00:05
    和关系型数据库一样,元数据可以看做是描述数据的数据,包括1.hive表的数据库名、表名、字段名称与类型、分区字段与类型 2.表及分区的属性、存放位置等 元数据存储路径和內表一样,分为本地和远程,可通过hive-site...
  • 如何利用ajax请求后端服务将数据库数据渲染到前端的表格
  • JAVA根据数据库表生成word表格文档

    千次阅读 2017-06-08 13:22:58
    public static String[] FILEDS = new String[]{"字段名","字段类型","长度","主键/外键","默认值","描述"}; public static int[] COLUMN_WIDTHS = new int[] {1504,1504,1504,1504,1504,1504}; public static ...
  • Java获得数据库基本信息,包括表的信息、表中列的信息、索引信息、存储过程信息等。先创建与数据库的连接,通过Connection 对象的getMetaData()方法可以创建DatabaseMetaData对象,从该对象中获取数据库的基本信息。...
  • asp将数据库的表输出到Excel表格

    千次阅读 2009-12-02 09:15:00
    在Access和MSSqlserver里都有将表直接导出到Excel的工具,可是当客户需要在程序里将数据库里的表生成Excel表格时,我们用一般的T-sql语句很难做到!下面是我结合网上资料和客户的需求写的代码,仅供学习交流.set rs=...
  • 数据库

    千次阅读 2014-04-14 12:42:22
    1 基本简介  数据库(Database)是按照数据结构来组织、...数据库有很多种类型,从最简单的存储有各种数据的表格到能够进行海量数据存储的大型数据库系统都在各个方面得到了广泛的应用。 2 主要特点 2.1 数据整体性
  • 最近因为需要学习了一下使用C#操作Excel表格,现在把我使用C#如何定制表格的过程提供需要的兄弟: /*从数据库提取数据*/ string strconn="packet size=4096;user id=sa;data source=localhost;persist security ...
  • 关系型数据库与NoSQL数据库简述

    千次阅读 2017-09-21 16:10:44
    简单定义,关系模型指的就是二维表格模型,而一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织。关系模型中常用的概念: 关系:可以理解为一张二维表,每个关系都具有一个关系名,就是通常说的...
  • 数据库结构

    2020-08-31 11:12:47
    比如我们在创建包含下面三个字段的学生表格时,“学号字段为varchar(11),Name字段为varchar(10),Age字段为int”,那么这个完整的描述就是该表格的模式。模式可以理解为表格的结构。 2.视图(View)是指某一个表现...
  • 如何利用SQL查询语句从SQLSERVER数据库中导入导出EXCEL表格   平常从SQLSERVER中进行导入导出时,我们利用SQLSERVER中自带的DTS转换工具即可,很方便。但有些特殊的用法需要用语句进行导入导出,工作中碰到这种...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 82,543
精华内容 33,017
关键字:

给数据库表格描述信息