精华内容
下载资源
问答
  • 银行系统项目设计文档(详细文档)

    热门讨论 2010-01-27 13:19:53
    刚接到这个问题时,我们还一窍不通,但是通过自己上图书馆找资料、上网搜教程、上网找答案、上网求助等各种方法从无到有,从认识到运用,老师的帮助下,我们大大提高了运用各种资料学习的能力。 其实,这还不是最...
  • 意思是SQL,不能用<em>%d,要换成<em><strong>%s</strong></em>. 后来,我pymysql文档中也找到了相似的解答。于是,我将代码修改成: <blockquote>sql_insert = "INSERT INTO `post` (`nick_name`, ...
  • 听到过有这样一句话,“学习开源,就尽可能的代码里找答案,而不是代码之外去找答案,那些都是二手的,而且很可能是不准确的。” 这里小编介绍两种关于有效学习开源项目代码的习惯: 一: 1.先去查找和阅读...

    听到过有这样一句话,“学习开源,就尽可能的在代码里找答案,而不是在代码之外去找答案,那些都是二手的,而且很可能是不准确的。”

    这里小编介绍两种关于有效学习开源项目代码的习惯:

    一:

    1.先去查找和阅读与该项目的博客和资料,通过google能找到某个项目大体介绍的博客,快速浏览一下,对这个项目的功能、目的、基本使用有基本的了解。

    2.阅读项目文档,重点查阅Gettingstarted、Example之类的文档,从中了解如何下载、安装、以及使用该项目所需要的基本知识。

    3.如果该项目有已经完成的example工程,先尝试按照开始文档的步骤,运行example,若果遇到问题,则要尝试在项目的FAQ等文档中查找答案;其次,将问题作为搜索的关键词搜索,寻找相关的解决办法;最后,还可将问题提交到项目的邮件列表,征求集体的意见。注意:在没有成功运行example之前,不要尝试修改example。

    4.在运行了第一个example之后,根据自身的理解去尝试需要修改example,测试高级功能等。

    5. 在掌握基本使用功能后,则开始深入的了解该项目。比如:项目的配置管理、高级功能等。

    6.如果在允许的范围内,尝试从源码上构建该项目。一般开源项目都会提供一份构建指南,介绍如何搭建开发、调试和构建的环境。

    7.如可以根据自身兴趣,尝试阅读源码:

    (1)阅读源码之前,查看该项目是否提供架构和设计文档,阅读这些文档可以了解该项目的大体设计和结构,则读源码的时候不会无从下手。

    (2)在阅读源码时要抓住主干,尝试理清一次正常运行的代码的调用路径,这可以通过debug来观察运行时的变量和行为。同时在修改源码时,加入日志和打印可以更好的理解源码。

    (3)画图,理清主干后,可以将整个流程画成流程图或者是标准的UML图,帮助记忆以及下一步的阅读。

    (4)以兴趣为主,挑选感兴趣的“枝叶”代码去阅读。

    (5)在阅读程序源码的时候,重视单元测试,尝试来运行单元测试,基本上一个好的单元测试会将该代码的功能和边界描述清晰。

    (7)在熟悉源码后,发现有可以改进的地方,可以向该项目的开发者提出改进的意见或者issue,可以进一步帮住开发者修复和实现,参与该项目的发展。

    8.通常在阅读文档和源码之后,在对该项目有比较深入的了解时,还可以进一步在广度和深度之间权衡。

    第二种方法和第一种类似,但有有点不同下面看看第二种方法:

    二:

    1 反复地操作软件,熟悉软件的组成文件以及软件功能,同时注意IE地址栏内的地址变化。

    2存放数据的XML文件或者打开数据库文件,参照数据字典,了解各个表和字段的数据含意,若没有数据字典,就利用运行软件,进行数据的输入,参照输入的数据,了解各个表和字段的数据含意。

    3 使用Visio进行反向工程,抽出类图。

    4 研究“类”之间的关系,注释各个类的属性以及方法,了解程序的整体框架。

    5 另外去开一个项目,按照软件开发的流程,将代码分段复制进新的项目,进行编译调试。

    搜索inxedu,更多分享。

    展开全文
  • 网上搜索良久,也没有答案没办法,只能去这里https://developer.mozilla.org/zh-CN/docs/Web/API/Blob/text查找文档。 废话少数,直接把代码贴出来 Vue.axios({ method: 'post', ...

    之前使用axios下载一直是好好的,知道产品提出,下载的错误信息需要提示出来而不是显示在下载文件里面。

    在网上搜索良久,也没有答案没办法,只能去这里找https://developer.mozilla.org/zh-CN/docs/Web/API/Blob/text查找文档。

     

    废话少数,直接把代码贴出来

     Vue.axios({
          method: 'post',
          url: param.url,
          data: param.body,
          headers: param.headers || {responseType: 'blob'},
          responseType: 'blob'
        }).then(async res => {
          // 导出错误模板提示
          if (res.data.type === 'application/json') {
            const text = await res.data.text()
            const jsonText = await JSON.parse(text)
            resolve(jsonText)
          } else {
            const success = {
              status: 200
            }
            let fileName = ``
            const content = res.data
            if (res.headers) {
              fileName = decodeURI(decodeURI(res.headers['content-disposition'])).split('filename=')[1]
            }
            if (!fileName) {
              fileName = `${Vue.$moment().format('YYYYMMDDhhmm')}.xls`
            }
            const blob = new Blob([content], {
              type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8'
            })
            if ('download' in document.createElement('a')) {
              const elink = document.createElement('a')
              elink.download = fileName
              elink.style.display = 'none'
              elink.href = URL.createObjectURL(blob)
              document.body.appendChild(elink)
              elink.click()
              URL.revokeObjectURL(elink.href)
              document.body.removeChild(elink)
            } else {
              navigator.msSaveBlob(blob, fileName)
            }
            resolve(success)
          }

    起作用的就是这段代码。

    把返回来的流文件解析为json。

    正确时直接下载模板。错误时判断返回类型,转换json。

    注意是一个异步方法 使用 async await处理就好

    展开全文
  • 标签 PostgreSQL , 超级用户 , superuser 背景 数据库中哪些操作需要超级用户的权限才能执行?...但是从源码里面是比较好出这个答案的。 权限 例如 postgres=# select * from pg_authid; rolname | ro...

    标签

    PostgreSQL , 超级用户 , superuser


    背景

    在数据库中哪些操作需要超级用户的权限才能执行?

    这个问题翻文档可能翻不全面,或者是已经比较难以完成的任务。

    但是从源码里面是比较好找出这个答案的。

    权限

    例如

    postgres=# select * from pg_authid;
          rolname      | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcanlogin | rolreplication | rolbypassrls | rolconnlimit | rolpassword | rolvaliduntil 
    -------------------+----------+------------+---------------+-------------+-------------+----------------+--------------+--------------+-------------+---------------
     postgres          | t        | t          | t             | t           | t           | t              | t            |           -1 |             | 
     pg_signal_backend | f        | t          | f             | f           | f           | f              | f            |           -1 |             | 
     test              | f        | t          | f             | f           | t           | f              | f            |           -1 |             | 
     dba               | f        | t          | f             | f           | t           | f              | f            |           -1 |             | 
     test1             | f        | t          | f             | f           | f           | f              | f            |           -1 |             | 
     digoal            | f        | t          | f             | f           | t           | f              | f            |           -1 |             | 
     a                 | f        | t          | f             | f           | t           | f              | f            |           -1 |             | 
     b                 | f        | t          | f             | f           | t           | f              | f            |           -1 |             | 
    (8 rows)
    

    rolsuper 就表示是否具备超级用户权限。

    代码中如何判断超级用户

    src/backend/utils/misc/superuser.c

    /*
     * The Postgres user running this command has Postgres superuser privileges
     */
    bool
    superuser(void)
    {
            return superuser_arg(GetUserId());
    }
    
    /*
     * The specified role has Postgres superuser privileges
     */
    bool
    superuser_arg(Oid roleid)
    {
            bool            result;
            HeapTuple       rtup;
    
            /* Quick out for cache hit */
            if (OidIsValid(last_roleid) && last_roleid == roleid)
                    return last_roleid_is_super;
    
            /* Special escape path in case you deleted all your users. */
            if (!IsUnderPostmaster && roleid == BOOTSTRAP_SUPERUSERID)
                    return true;
    
            /* OK, look up the information in pg_authid */
            rtup = SearchSysCache1(AUTHOID, ObjectIdGetDatum(roleid));
            if (HeapTupleIsValid(rtup))
            {
                    result = ((Form_pg_authid) GETSTRUCT(rtup))->rolsuper;  // 最终还是读取pg_authid中的rolsuper字段  
                    ReleaseSysCache(rtup);
            }
            else
            {
                    /* Report "not superuser" for invalid roleids */
                    result = false;
            }
    
            /* If first time through, set up callback for cache flushes */
            if (!roleid_callback_registered)
            {
                    CacheRegisterSyscacheCallback(AUTHOID,
                                                                              RoleidCallback,
                                                                              (Datum) 0);
                    roleid_callback_registered = true;
            }
    
            /* Cache the result for next time */
            last_roleid = roleid;
            last_roleid_is_super = result;
    
            return result;
    }
    

    在PostgreSQL代码里面,通过FormData_pg_authid结构来表示pg_authid的表结构

    CATALOG(pg_authid,1260) BKI_SHARED_RELATION BKI_ROWTYPE_OID(2842) BKI_SCHEMA_MACRO
    {
        NameData    rolname;        /* name of role */
        bool        rolsuper;       /* read this field via superuser() only! */
        bool        rolinherit;     /* inherit privileges from other roles? */
        bool        rolcreaterole;  /* allowed to create more roles? */
        bool        rolcreatedb;    /* allowed to create databases? */
        bool        rolcatupdate;   /* allowed to alter catalogs manually? */
        bool        rolcanlogin;    /* allowed to log in as session user? */
        bool        rolreplication; /* role used for streaming replication */
        int32       rolconnlimit;   /* max connections allowed (-1=no limit) */
    
        /* remaining fields may be null; use heap_getattr to read them! */
        text        rolpassword;    /* password, if any */
        timestamptz rolvaliduntil;  /* password expiration time, if any */
    } FormData_pg_authid;
    
    #undef timestamptz
    
    
    /* ----------------
     *      Form_pg_authid corresponds to a pointer to a tuple with
     *      the format of pg_authid relation.
     * ----------------
     */
    typedef FormData_pg_authid *Form_pg_authid;
    

    代码中如何判断用户是否有replication的权限

    以此类推,

    src/backend/utils/init/miscinit.c

    /*
     * Check whether specified role has explicit REPLICATION privilege
     */
    bool
    has_rolreplication(Oid roleid)
    {
            bool            result = false;
            HeapTuple       utup;
    
            utup = SearchSysCache1(AUTHOID, ObjectIdGetDatum(roleid));
            if (HeapTupleIsValid(utup))
            {
                    result = ((Form_pg_authid) GETSTRUCT(utup))->rolreplication;
                    ReleaseSysCache(utup);
            }
            return result;
    }
    

    人肉时间, 找出需要判断超级用户的地方

    grep -r "superuser()" *
    
    contrib/file_fdw/file_fdw.c:    if (catalog == ForeignTableRelationId && !superuser())
    contrib/dblink/dblink.c:        if (!superuser())
    contrib/dblink/dblink.c:        if (!superuser())
    contrib/pgstattuple/pgstatindex.c:      if (!superuser())
    contrib/pgstattuple/pgstatindex.c:      if (!superuser())
    contrib/pgstattuple/pgstatindex.c:      if (!superuser())
    contrib/pgstattuple/pgstatindex.c:      if (!superuser())
    contrib/pgstattuple/pgstatindex.c:      if (!superuser())
    contrib/pgstattuple/pgstattuple.c:      if (!superuser())
    contrib/pgstattuple/pgstattuple.c:      if (!superuser())
    contrib/pgstattuple/pgstatapprox.c:     if (!superuser())
    contrib/pg_stat_statements/pg_stat_statements.c:        bool            is_superuser = superuser();
    contrib/sepgsql/label.c:        if (!superuser())
    contrib/pageinspect/brinfuncs.c:        if (!superuser())
    contrib/pageinspect/brinfuncs.c:        if (!superuser())
    contrib/pageinspect/brinfuncs.c:        if (!superuser())
    contrib/pageinspect/brinfuncs.c:        if (!superuser())
    contrib/pageinspect/fsmfuncs.c: if (!superuser())
    contrib/pageinspect/ginfuncs.c: if (!superuser())
    contrib/pageinspect/ginfuncs.c: if (!superuser())
    contrib/pageinspect/ginfuncs.c: if (!superuser())
    contrib/pageinspect/heapfuncs.c:        if (!superuser())
    contrib/pageinspect/heapfuncs.c:        if (!superuser())
    contrib/pageinspect/btreefuncs.c:       if (!superuser())
    contrib/pageinspect/btreefuncs.c:       if (!superuser())
    contrib/pageinspect/btreefuncs.c:       if (!superuser())
    contrib/pageinspect/rawpage.c:  if (!superuser())
    contrib/pageinspect/rawpage.c:  if (!superuser())
    contrib/adminpack/adminpack.c:  if (!superuser())
    contrib/adminpack/adminpack.c:  if (!superuser())
    contrib/postgres_fdw/connection.c:              if (!superuser() && !PQconnectionUsedPassword(conn))
    contrib/postgres_fdw/connection.c:      if (superuser())
    src/include/catalog/pg_authid.h:        bool            rolsuper;               /* read this field via superuser() only! */
    src/test/modules/dummy_seclabel/dummy_seclabel.c:               if (!superuser())
    src/test/regress/regress.c:     if (!superuser())
    src/test/regress/regress.c:     if (!superuser())
    src/backend/commands/copy.c:    if (!pipe && !superuser())
    src/backend/commands/trigger.c:                 if (!superuser())
    src/backend/commands/dbcommands.c:                (encoding == PG_SQL_ASCII && superuser())))
    src/backend/commands/dbcommands.c:                (encoding == PG_SQL_ASCII && superuser())))
    src/backend/commands/dbcommands.c:      if (superuser())
    src/backend/commands/opclasscmds.c:     if (!superuser())
    src/backend/commands/opclasscmds.c:     if (!superuser())
    src/backend/commands/opclasscmds.c:     if (!superuser())
    src/backend/commands/tablespace.c:      if (!superuser())
    src/backend/commands/event_trigger.c:   if (!superuser())
    src/backend/commands/foreigncmds.c:     if (!superuser())
    src/backend/commands/foreigncmds.c:             if (!superuser())
    src/backend/commands/foreigncmds.c:     if (!superuser())
    src/backend/commands/foreigncmds.c:     if (!superuser())
    src/backend/commands/tsearchcmds.c:     if (!superuser())
    src/backend/commands/tsearchcmds.c:     if (!superuser())
    src/backend/commands/amcmds.c:  if (!superuser())
    src/backend/commands/amcmds.c:  if (!superuser())
    src/backend/commands/functioncmds.c:            if (!superuser())
    src/backend/commands/functioncmds.c:    if (isLeakProof && !superuser())
    src/backend/commands/functioncmds.c:            if (procForm->proleakproof && !superuser())
    src/backend/commands/functioncmds.c:            if (!superuser())
    src/backend/commands/functioncmds.c:            if (!superuser())
    src/backend/commands/tablecmds.c:                       if (!superuser())
    src/backend/commands/extension.c:       if (control->superuser && !superuser())
    src/backend/commands/aggregatecmds.c:           if (transTypeId == INTERNALOID && superuser())
    src/backend/commands/aggregatecmds.c:                   if (mtransTypeId == INTERNALOID && superuser())
    src/backend/commands/alter.c:   if (!superuser())
    src/backend/commands/alter.c:   if (!superuser())
    src/backend/commands/alter.c:           if (!superuser())
    src/backend/commands/proclang.c:                if (!superuser())
    src/backend/commands/proclang.c:                if (!superuser())
    src/backend/commands/user.c:            if (!superuser())
    src/backend/commands/user.c:            if (!superuser())
    src/backend/commands/user.c:            if (!superuser())
    src/backend/commands/user.c:            if (!superuser())
    src/backend/commands/user.c:            if (!superuser())
    src/backend/commands/user.c:            if (!superuser())
    src/backend/commands/user.c:                    if (!superuser())
    src/backend/commands/user.c:            if (!superuser())
    src/backend/commands/user.c:                    !superuser())
    src/backend/commands/user.c:            if (!superuser())
    src/backend/commands/user.c:            if (!superuser())
    src/backend/commands/user.c:    if (grantorId != GetUserId() && !superuser())
    src/backend/commands/user.c:            if (!superuser())
    src/backend/commands/typecmds.c:        if (!superuser())
    src/backend/commands/typecmds.c:                if (!superuser())
    src/backend/libpq/be-fsstubs.c: if (!superuser())
    src/backend/libpq/be-fsstubs.c: if (!superuser())
    src/backend/catalog/system_views.sql:-- than use explicit 'superuser()' checks in those functions, we use the GRANT
    src/backend/catalog/pg_proc.c:                                                          (superuser() ? PGC_SUSET : PGC_USERSET),
    src/backend/tcop/utility.c:                             load_file(stmt->filename, !superuser());
    src/backend/tcop/utility.c:                     if (!superuser())
    src/backend/postmaster/pgstat.c:                        if (checkUser && !superuser() && beentry->st_userid != GetUserId())
    src/backend/replication/slotfuncs.c:    if (!superuser() && !has_rolreplication(GetUserId()))
    src/backend/replication/walreceiver.c:  if (!superuser())
    src/backend/replication/walsender.c:            if (!superuser())
    src/backend/replication/logical/origin.c:       if (!superuser())
    src/backend/replication/logical/logicalfuncs.c: if (!superuser() && !has_rolreplication(GetUserId()))
    src/backend/utils/fmgr/fmgr.c:                                          (superuser() ? PGC_SUSET : PGC_USERSET),
    src/backend/utils/misc/guc.c:           !superuser())
    src/backend/utils/misc/guc.c:   if ((record->flags & GUC_SUPERUSER_ONLY) && !superuser())
    src/backend/utils/misc/guc.c:   if (!superuser())
    src/backend/utils/misc/guc.c:                                                                    (superuser() ? PGC_SUSET : PGC_USERSET),
    src/backend/utils/misc/guc.c:                                                                    (superuser() ? PGC_SUSET : PGC_USERSET),
    src/backend/utils/misc/guc.c:                                                    (superuser() ? PGC_SUSET : PGC_USERSET),
    src/backend/utils/misc/guc.c:                                                    (superuser() ? PGC_SUSET : PGC_USERSET),
    src/backend/utils/misc/guc.c:   bool            am_superuser = superuser();
    src/backend/utils/misc/guc.c:   if ((record->flags & GUC_SUPERUSER_ONLY) && !superuser())
    src/backend/utils/misc/guc.c:                   ((conf->flags & GUC_SUPERUSER_ONLY) && !superuser()))
    src/backend/utils/misc/guc.c:   if (conf->source == PGC_S_FILE && superuser())
    src/backend/utils/misc/guc.c:   if (superuser())
    src/backend/utils/misc/guc.c:           if (superuser())
    src/backend/utils/misc/guc.c:   else if (gconf->context == PGC_SUSET && superuser())
    src/backend/utils/misc/guc.c:                                                    superuser() ? PGC_SUSET : PGC_USERSET,
    src/backend/utils/misc/superuser.c: *     The superuser() function.  Determines if user has superuser privilege.
    src/backend/utils/init/postinit.c:                      am_superuser = superuser();
    src/backend/utils/init/postinit.c:              am_superuser = superuser();
    src/backend/utils/init/postinit.c:              if (!superuser() && !has_rolreplication(GetUserId()))
    src/backend/utils/adt/misc.c:   if (superuser_arg(proc->roleId) && !superuser())
    src/backend/utils/adt/genfile.c:        if (!superuser())
    src/backend/utils/adt/genfile.c:        if (!superuser())
    src/backend/utils/adt/genfile.c:        if (!superuser())
    src/backend/utils/adt/genfile.c:        if (!superuser())
    src/bin/psql/prompt.c:                                  if (is_superuser())
    

    去代码里面看吧,举一些例子

    例子

    1. 只有超级用户可以修改或设置file_fdw foreign table的options

    contrib/file_fdw/file_fdw.c
    
            if (catalog == ForeignTableRelationId && !superuser())
                    ereport(ERROR,
                                    (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
                                     errmsg("only superuser can change options of a file_fdw foreign table")));
    

    2. 只有超级用户能读取数据库所在服务器的文件

    src/backend/utils/adt/genfile.c
    
    Datum
    pg_read_file(PG_FUNCTION_ARGS)
    {
    ...
            if (!superuser())
                    ereport(ERROR,
                                    (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
                                     (errmsg("must be superuser to read files"))));
    
    Datum
    pg_read_binary_file(PG_FUNCTION_ARGS)
    {
    ...
    
            if (!superuser())
                    ereport(ERROR,
                                    (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
                                     (errmsg("must be superuser to read files"))));
    

    3. 只有超级用户可以查看需要超级用户权限才能查看的参数

    src/include/utils/guc.h
    
    /*
     * bit values in "flags" of a GUC variable
     */
    #define GUC_LIST_INPUT                  0x0001  /* input can be list format */
    #define GUC_LIST_QUOTE                  0x0002  /* double-quote list elements */
    #define GUC_NO_SHOW_ALL                 0x0004  /* exclude from SHOW ALL */
    #define GUC_NO_RESET_ALL                0x0008  /* exclude from RESET ALL */
    #define GUC_REPORT                              0x0010  /* auto-report changes to client */
    #define GUC_NOT_IN_SAMPLE               0x0020  /* not in postgresql.conf.sample */
    #define GUC_DISALLOW_IN_FILE    0x0040  /* can't set in postgresql.conf */
    #define GUC_CUSTOM_PLACEHOLDER  0x0080  /* placeholder for custom variable */
    #define GUC_SUPERUSER_ONLY              0x0100  /* show only to superusers */
    #define GUC_IS_NAME                             0x0200  /* limit string to NAMEDATALEN-1 */
    #define GUC_NOT_WHILE_SEC_REST  0x0400  /* can't set if security restricted */
    #define GUC_DISALLOW_IN_AUTO_FILE 0x0800                /* can't set in
    
    src/backend/utils/misc/guc.c
    
            if (restrict_superuser &&
                    (record->flags & GUC_SUPERUSER_ONLY) &&
                    !superuser())
                    ereport(ERROR,
                                    (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
                                     errmsg("must be superuser to examine \"%s\"", name)));
    ...
    

    4. 只有超级用户能执行alter system

    src/backend/utils/misc/guc.c
    
            if (!superuser())
                    ereport(ERROR,
                                    (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
                             (errmsg("must be superuser to execute ALTER SYSTEM command"))));
    

    5. 只有超级用户能创建language

    src/backend/commands/proclang.c
    
                    /*
                     * Check permission
                     */
                    if (!superuser())
                    {
                            if (!pltemplate->tmpldbacreate)
                                    ereport(ERROR,
                                                    (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
                                                     errmsg("must be superuser to create procedural language \"%s\"",
                                                                    stmt->plname)));
                            if (!pg_database_ownercheck(MyDatabaseId, GetUserId()))
                                    aclcheck_error(ACLCHECK_NOT_OWNER, ACL_KIND_DATABASE,
                                                               get_database_name(MyDatabaseId));
                    }
    

    如果你发现报错中包含了权限错误的问题,也可以使用这个方法找到对应的代码。

    \set VERBOSITY verbose
    
    test=> \set VERBOSITY verbose
    test=> create role b replication;
    ERROR:  42501: must be superuser to create replication users
    LOCATION:  CreateRole, user.c:319
    
    对应的代码在user.c的319行, CreateRole函数中.  
    

    就举这些例子,其他的可以自己看一下。

    阿里云rds_superuser和superuser有什么区别

    为了维护便利,阿里云RDS PostgreSQL开放了一个权限名为rds_superuser给用户,比superuser少一些权限,主要是文件操作相关的,并且不能越权做superuser能做的事情。

    相比普通用户,rds_superuser多了以下权限(我们也会逐渐的开放更多的权限给用户,以下是目前支持的权限)。

    -- 创建插件
    create extension ?;  
    
    -- 创建非superuser,repliction权限用户
    create role ?;  
    
    -- 非supuer owned对象的操作
    alter table test.test rename to test1;
    alter table test.test1 owner to test_rdssuper;
    alter table test.test1 rename to test;
    alter table test.test owner to test_norm;
    
    -- SET SESSION AUTHORIZATION、SET ROLE可以set非superuser用户
    set role to test_norm;
    reset role;
    
    -- 所有对象的vacuum、analyze操作
    vacuum pg_class;
    analyze pg_class;
    
    -- pg_stat_reset (pgstat_reset_counters) pg_stat_reset_shared(pgstat_reset_shared_counters)
    select pg_stat_reset();
    select pg_stat_reset_shared('bgwriter');
    
    -- pgstat_reset_single_counter
    select pg_stat_reset_single_table_counters('test.test'::regclass::oid);
    select pg_stat_reset_single_function_counters('pg_stat_get_activity'::regproc::oid);
    
    -- pg_stat_get_activity pg_stat_get_backend_activity pg_stat_get_backend_waiting pg_stat_get_backend_activity_start pg_stat_get_backend_xact_start pg_stat_get_backend_start pg_stat_get_backend_client_addr pg_stat_get_backend_client_port
    
    -- select pg_stat_get_activity()
    SELECT pg_stat_get_backend_pid(s.backendid) AS pid, pg_stat_get_backend_activity(s.backendid) AS query,pg_stat_get_backend_waiting(s.backendid) AS waiting, pg_stat_get_backend_xact_start(s.backendid) AS xact_start, pg_stat_get_backend_start(s.backendid) AS bd_start, pg_stat_get_backend_client_addr(s.backendid) AS ip, pg_stat_get_backend_client_port(s.backendid) AS port FROM (SELECT pg_stat_get_backend_idset() AS backendid) AS s;
    
    -- pgstatindex pgstatindexbyid pgstatginindex pg_relpages pg_relpagesbyid pgstattuple 
    create extension pgstattuple; 
    SELECT * FROM pgstattuple('pg_catalog.pg_proc'); 
    SELECT * FROM pgstatindex('pg_cast_oid_index'); 
    SELECT * FROM pgstatginindex('test_gin_index'); 
    
    -- pg_stat_statments
    
    -- 中文分词相关
    CREATE EXTENSION zhparser;
    CREATE TEXT SEARCH CONFIGURATION testzhcfg (PARSER = zhparser);
    ALTER TEXT SEARCH CONFIGURATION testzhcfg ADD MAPPING FOR n,v,a,i,e,l WITH simple;
    
    -- finish prepared transaction,提交或回滚两阶段提交的事务
    \c - test_norm
    begin;
    insert into test.test values(2);
    prepare transaction 't1';
    \c - test_rdssuper
    select * from pg_prepared_xacts ;
    commit prepared 't1';
    
    -- alter type owner
    \c - test_norm
    CREATE TYPE compfoo AS (f1 int, f2 text); 
    \c - test_rdssuper
    alter type compfoo owner to test_rdssuper; 
    
    -- 允许rds_superuser用户设置session_preload_libraries,以便于用户使用pg_hint_plan等
    alter role all set session_preload_libraries = 'pg_hint_plan';
    alter role all set set pg_hint_plan.debug_print = on;
    \c - superuser
    /*+ SeqScan(test.test) */ select * from test.test;
    \c - test_rdssuper
    /*+ SeqScan(test.test) */ select * from test.test;
    
    -- 支持设置session_preload_libraries,设置的值必须是rds_available_extensions里面的插件
    alter role all set session_preload_libraries = 'plperlu';  -- ERROR: invalid value for parameter "session_preload_libraries": "plperlu"
    alter role all set session_preload_libraries = 'plperl,postgis';
    
    -- grant role to
    grant test_norm to test_rdssuper;
    
    -- revoke role from
    revoke test_norm from test_rdssuper;
    
    -- rds_superuser可以set
    SET SESSION AUTHORIZATION ?;
    
    -- 允许rds_superuser通过dblink连接本地数据库,不需要配置port,host,ip,只需要指定dbname
    
    -- 支持oss_fdw
    
    -- 创建RDS实例时的超级用户自带了replication角色,允许用来做流复制
    
    -- 允许rds_superuser设置temp_file_limit参数
    
    -- 允许rds_superuser修改schema
    grant all on schema test to test_another;
    展开全文
  • 友盟第三方分享自定义分享面板

    千次阅读 2016-12-28 19:09:48
    那么如何添加一个分享面板(选择分享平台)来操作呢,这里就需要到进阶文档里去寻找答案了,我做的时候按照进阶文档中的代码集成过一次,但是报红了,由于时间问题,我就直接到下载的文档中去了; 到下载的sdk...
    做过友盟第三方分享的都知道,在快速继承的文档中,我们只可以通过SHARE_MEDIA来更改分享的平台,而且是没有分享面板的,那么如何添加一个分享面板(选择分享平台)来操作呢,这里就需要到进阶文档里去寻找答案了,我在做的时候按照进阶文档中的代码集成过一次,但是报红了,由于时间问题,我就直接到下载的文档中去找了;
    到下载的sdk(umeng_android_social_sdk_6.1.1_custom)/social_sdk_example_as/app/src/main/java/com/umeng/soexample文件夹下找到ShareActivity/ShareDetailActivity/ShareMenuActivity,这里我就不一步一步教大家怎么找代码了,我直接把我昨晚的代码放出来吧:
    private ShareAction mShareAction;
    private UMShareListener mShareListener;

    mShareListener = new CustomShareListener(this);
    /*增加自定义按钮的分享面板*/
    mShareAction = new ShareAction(DetailsActivity.this).setDisplayList(
            //可分享的平台
            SHARE_MEDIA.WEIXIN, SHARE_MEDIA.WEIXIN_CIRCLE, SHARE_MEDIA.WEIXIN_FAVORITE,
            SHARE_MEDIA.SINA, SHARE_MEDIA.QQ, SHARE_MEDIA.QZONE,
            SHARE_MEDIA.ALIPAY, SHARE_MEDIA.RENREN, SHARE_MEDIA.DOUBAN,
            SHARE_MEDIA.SMS, SHARE_MEDIA.EMAIL, SHARE_MEDIA.YNOTE,
            SHARE_MEDIA.EVERNOTE, SHARE_MEDIA.LAIWANG, SHARE_MEDIA.LAIWANG_DYNAMIC,
            SHARE_MEDIA.LINKEDIN, SHARE_MEDIA.YIXIN, SHARE_MEDIA.YIXIN_CIRCLE,
            SHARE_MEDIA.TENCENT, SHARE_MEDIA.FACEBOOK, SHARE_MEDIA.TWITTER,
            SHARE_MEDIA.WHATSAPP, SHARE_MEDIA.GOOGLEPLUS, SHARE_MEDIA.LINE,
            SHARE_MEDIA.INSTAGRAM, SHARE_MEDIA.KAKAO, SHARE_MEDIA.PINTEREST,
            SHARE_MEDIA.POCKET, SHARE_MEDIA.TUMBLR, SHARE_MEDIA.FLICKR,
            SHARE_MEDIA.FOURSQUARE, SHARE_MEDIA.MORE)
            .addButton("umeng_sharebutton_custom", "umeng_sharebutton_custom", "zijian", "zijian")
            .setShareboardclickCallback(new ShareBoardlistener() {
                @Override
                public void onclick(SnsPlatform snsPlatform, SHARE_MEDIA share_media) {
                    if (snsPlatform.mShowWord.equals("umeng_sharebutton_custom")) {
                        Toast.makeText(DetailsActivity.this, "自定义按钮", Toast.LENGTH_LONG).show();
                    } else {
                        //分享内容
                        new ShareAction(DetailsActivity.this).withText("你好,我是仲康")
                                .withTitle("交个朋友吧")
                                .withTargetUrl("https://www.duba.com/?un_449343_3300")
                                .withMedia(new UMImage(DetailsActivity.this,R.mipmap.ic_launcher))
                                .setPlatform(share_media)
                                .setCallback(mShareListener)
                                .share();
                    }
                }
            });
    
    
    //自定义分享面板分享监听
    
    private static class CustomShareListener implements UMShareListener {
    
        private WeakReference<ShareMenuActivity> mActivity;
    
        private CustomShareListener(DetailsActivity activity) {
            mActivity = new WeakReference(activity);
        }
    
        @Override
        public void onResult(SHARE_MEDIA platform) {
    
            if (platform.name().equals("WEIXIN_FAVORITE")) {
                Toast.makeText(mActivity.get(), platform + " 收藏成功啦", Toast.LENGTH_SHORT).show();
            } else {
                if (platform!= SHARE_MEDIA.MORE&&platform!=SHARE_MEDIA.SMS
                        &&platform!=SHARE_MEDIA.EMAIL
                        &&platform!=SHARE_MEDIA.FLICKR
                        &&platform!=SHARE_MEDIA.FOURSQUARE
                        &&platform!=SHARE_MEDIA.TUMBLR
                        &&platform!=SHARE_MEDIA.POCKET
                        &&platform!=SHARE_MEDIA.PINTEREST
                        &&platform!=SHARE_MEDIA.LINKEDIN
                        &&platform!=SHARE_MEDIA.INSTAGRAM
                        &&platform!=SHARE_MEDIA.GOOGLEPLUS
                        &&platform!=SHARE_MEDIA.YNOTE
                        &&platform!=SHARE_MEDIA.EVERNOTE){
                    Toast.makeText(mActivity.get(), platform + " 分享成功啦", Toast.LENGTH_SHORT).show();
                }
    
            }
        }
    
        @Override
        public void onError(SHARE_MEDIA platform, Throwable t) {
            if (platform!= SHARE_MEDIA.MORE&&platform!=SHARE_MEDIA.SMS
                    &&platform!=SHARE_MEDIA.EMAIL
                    &&platform!=SHARE_MEDIA.FLICKR
                    &&platform!=SHARE_MEDIA.FOURSQUARE
                    &&platform!=SHARE_MEDIA.TUMBLR
                    &&platform!=SHARE_MEDIA.POCKET
                    &&platform!=SHARE_MEDIA.PINTEREST
                    &&platform!=SHARE_MEDIA.LINKEDIN
                    &&platform!=SHARE_MEDIA.INSTAGRAM
                    &&platform!=SHARE_MEDIA.GOOGLEPLUS
                    &&platform!=SHARE_MEDIA.YNOTE
                    &&platform!=SHARE_MEDIA.EVERNOTE){
                Toast.makeText(mActivity.get(), platform + " 分享失败啦", Toast.LENGTH_SHORT).show();
                if (t != null) {
                    Log.d("throw", "throw:" + t.getMessage());
                }
            }
    
        }
    
        @Override
        public void onCancel(SHARE_MEDIA platform) {
    
            Toast.makeText(mActivity.get(), platform + " 分享取消了", Toast.LENGTH_SHORT).show();
        }
    }
    
    
    点击监听:
    //设置自定义分享面板的属性
    ShareBoardConfig config = new ShareBoardConfig();
    config.setShareboardPostion(ShareBoardConfig.SHAREBOARD_POSITION_CENTER);
    config.setMenuItemBackgroundShape(ShareBoardConfig.BG_SHAPE_CIRCULAR);
    config.setTitleText("开设么玩笑,分享不");
    config.setTitleTextColor(Color.RED);
    config.setMenuItemTextColor(Color.BLUE);
    
    config.setIndicatorColor(Color.GREEN);
    config.setCancelButtonBackground(Color.RED,Color.GREEN);
    config.setCancelButtonText("我不想分享了");
    config.setCancelButtonVisibility(false);
    config.setShareboardBackgroundColor(Color.rgb(100,100,100));
    config.setShareboardPostion(config.SHAREBOARD_POSITION_BOTTOM);
    config.setMenuItemBackgroundShape(config.BG_SHAPE_ROUNDED_SQUARE,10);
    config.setMenuItemBackgroundColor(Color.GREEN,Color.RED);
    config.setTitleVisibility(true);
    config.setCancelButtonVisibility(false);
    mShareAction.open(config);
    break;
    展开全文
  • 服务网关,对外暴露统一规范的接口和包装响应结果,包括各个子系统的交互接口、对外开放接口、开发加密接口、接口文档等服务,可该模块支持验签、鉴权、路由、限流、监控、容错、日志等功能。示例图: zheng-cms...
  • nodejs文档里也没有提到如何捕获创建失败这种情况。所以只能通过源码去找答案。不过坏消息是,我们无法捕获这个这个错误。下面看一下源码。我们直接从c++层开始分析。 当我们调用new Worker的时候,最后会调用c++的...
  • nodejs文档里也没有提到如何捕获创建失败这种情况。所以只能通过源码去找答案。不过坏消息是,我们无法捕获这个这个错误。下面看一下源码。我们直接从c++层开始分析。 当我们调用new Worker的时候,最后会调用c++的...
  • 了很久,终于找到了答案在文档了可以写自己要写的样式,太帅了。 并且能适应,如果你不能使用,你清除缓存就可以了。 在iframe.css写 具体操作: 写下如下代码: /可以在这里添加你自己的css/ img { max-...
  • 小编整理了一个PDF文档的面试题,由于平台不能上传文件,需要答案可以加小编的QQ交流群656315826,里面获取文档,也欢迎招聘者,工作的来,提供一个更大的平台(需要的朋友可以获取,希望可以帮助到大家) ...
  • nodejs创建线程问题

    2020-08-12 23:14:10
    nodejs文档里也没有提到如何捕获创建失败这种情况。所以只能通过源码去找答案。不过坏消息是,我们无法捕获这个这个错误。下面看一下源码。我们直接从c++层开始分析。 当我们调用new Worker的时候,最后会调用c++的...
  • NB-IOT面向实战开发

    2020-12-15 22:38:37
    针对核心的内容我们会先给大家讲实现的思路,配套画出流程图,最后再对照流程图实现代码,而不至于面对一个复杂的项目迷失代码的海洋里找不到方向 把STM32使用、Freertos的应用、阿里云物联网平台的应用的知识都...
  • (English Documents Available) C#下Lua编程支持 xLua为Unity、 .Net、 Mono等C#...入群的问题:有问题该先从哪找答案 回答:FAQ 平时也要谨记这答案,90%以上问题都可以FAQ里头找到答案。这些问题就别群刷屏了。
  • (English Documents Available) C#下Lua编程支持 xLua为Unity、 .Net、 Mono等C#...入群的问题:有问题该先从哪找答案 回答:FAQ 平时也要谨记这答案,90%以上问题都可以FAQ里头找到答案。这些问题就别群刷屏了。
  • 3.3.9 一个大的含有50M个URL的记录,一个小的含有500个URL的记录,出两个记录相同的URL 3.4.0 海量日志数据,提取出某日访问百度次数最多的那个IP 3.4.1 有10个文件,每个文件1G,每个文件的每一行都存放的是...
  • 答案是否定的,这一章中将给出答案。  第10章 SQL_TRACE和10046事件  SQL_TRACE和10046事件是会话级非常有用的两个工具,它们可以捕获会话当中SQL执行的详细信息,其中10046事件还可以获得SQL绑定变量的信息及...
  • 并利用具体的例子来全面介绍每个特性,不仅讨论了各个特性是什么,还说明了它是如何工作的,如何使用这个特性来开发软件,以及有关的常见陷阱。  本书面向所有oracle 数据库应用开发人员和dba。 作译者 作者  ...
  • 软件测试经典面试题 (超实用)

    热门讨论 2012-02-16 13:48:08
    如果有,请试述该工具的工作原理,并以一个具体的工作中的例子描述该工具是如何在实际工作中应用的。 26 92、软件测试活动的生命周期是什么? 26 93、请画出软件测试活动的流程图? 26 94、针对缺陷采取怎样管理措施...
  • 学习一个新工具时,有些人可能只是一本入门书,粗略地翻翻就浅尝辄止,并相信实践出真知;有些人更喜欢系统地研习文档,对每个细节精雕细刻;有些人喜欢收集一些独门密技;有些人喜欢亲身尝试书上的基本用例……。...
  • XLua_2018最新版

    2018-12-26 18:20:38
    * [常见问题解答](Assets/XLua/Doc/faq.md):常见问题都总结这里,初使用大多数问题都可以这里找到答案。 * (必看)[XLua教程](Assets/XLua/Doc/XLua教程.md):教程,其配套代码[这里](Assets/XLua/Tutorial/)。 ...
  • 有时候遇到问题的时候,我上面的人问的时候,要么是正忙,自己先上网查一下,要么是过来看一下,解决了,想问问过程(因为里面牵涉到很多框架的方法,没文档,不熟悉如何用),然后得到的的答案就是“就是这样的...
  • 6.22 如何在一个文件中判断声明为extern的数组的大小(例如,数组定义和大小在另一个文件中)?sizeof操作符似乎不行。 6.23 sizeof返回的大小是以字节计算的,怎样才能判断数组中有多少个元素呢? 第7章 内存分配 ...
  • 4. 定义的试卷可以重新编辑、排序、删除、调整,可以自动生成一份文档,也可以把现有的文档资料存到系统,内容不受限制。 研究方法--------------------- 这种试题库系统的基本思想是按照“知识点”来构建试卷,...
  • 《你必须知道的495个C语言问题》

    热门讨论 2010-03-20 16:41:18
    1.8 如何在C中实现不透明(抽象)数据类型? 5 1.9 如何生成“半全局变量”,就是那种只能被部分源文件中的部分函数访问的变量? 5 存储类型 6 1.10 同一个静态(static)函数或变量的所有声明都必须包含static...
  • .htaccess

    2007-07-19 01:51:18
    In this part I will show you how to use the .htaccess file to implement some of these. 在上一部分,我已经简单介绍了.htaccess以及它的一些有用功能,这一部分,我将向你演示如何使用.htaccess文档去...
  • JAVA面试题最全集

    2010-03-13 13:09:10
    35.java除了8种基本类型外,虚拟机还有哪一种,有什么作用? 36.除了使用new关键字创建对象意外,试列举另外三种以上创建实例的方式? 37.classloader中,JDK的API、Classpath中的同web-inf中的class加载方式有...
  • 1.8 如何在C中实现不透明(抽象)数据类型? 5 1.9 如何生成“半全局变量”,就是那种只能被部分源文件中的部分函数访问的变量? 5 存储类型 6 1.10 同一个静态(static)函数或变量的所有声明都必须包含static...
  • 翻译的过程中,译者感到此言不虚:作者从数据库的基本概念到数据库建模,从如何运用规范化原则到如何做成实际的数据库表,从如何保护数据库完整性到如何提高数据库的性能,从数据库的安全机制到并发事务控制,从...

空空如也

空空如也

1 2 3
收藏数 48
精华内容 19
关键字:

如何在文档里找答案