destroyuser.sh
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:4k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1. #!/bin/sh
  2. #-------------------------------------------------------------------------
  3. #
  4. # destroyuser.sh--
  5. #    utility for destroying a user from the POSTGRES database.
  6. #
  7. # Copyright (c) 1994, Regents of the University of California
  8. #
  9. #
  10. # IDENTIFICATION
  11. #    $Header: /usr/local/cvsroot/pgsql/src/bin/destroyuser/destroyuser.sh,v 1.11 1999/03/14 16:00:55 momjian Exp $
  12. #
  13. # Note - this should NOT be setuid.
  14. #
  15. #-------------------------------------------------------------------------
  16. CMDNAME=`basename $0`
  17. if [ -z "$USER" ]; then
  18.     if [ -z "$LOGNAME" ]; then
  19. if [ -z "`whoami`" ]; then
  20.     echo "$CMDNAME: cannot determine user name"
  21.     exit 1
  22. fi
  23.     else
  24. USER=$LOGNAME
  25. export USER
  26.     fi
  27. fi
  28. while (test -n "$1")
  29. do
  30.     case $1 in 
  31. -a) AUTHSYS=$2; shift;;
  32.         -h) PGHOST=$2; shift;;
  33.         -p) PGPORT=$2; shift;;
  34.          *) DELUSER=$1;;
  35.     esac
  36.     shift;
  37. done
  38. if [ -z "$AUTHSYS" ]; then
  39.   AUTHOPT=""
  40. else
  41.   AUTHOPT="-a $AUTHSYS"
  42. fi
  43. if [ -z "$PGHOST" ]; then
  44.   PGHOSTOPT=""
  45. else
  46.   PGHOSTOPT="-h $PGHOST"
  47. fi
  48. if [ -z "$PGPORT" ]; then
  49.   PGPORTOPT=""
  50. else
  51.   PGPORTOPT="-p $PGPORT"
  52. fi
  53. PARGS="-tq $AUTHOPT $PGHOSTOPT $PGPORTOPT"
  54. #
  55. # generate the first part of the actual monitor command
  56. #
  57. PSQL="psql $PARGS"
  58. #
  59. # see if user $USER is allowed to create new users.  Only a user who can
  60. # create users can delete them.
  61. #
  62. QUERY="select usesuper from pg_user where usename = '$USER'"
  63. ADDUSER=`$PSQL -c "$QUERY" template1`
  64. if [ $? -ne 0 ]
  65. then
  66.     echo "$CMDNAME: database access failed."
  67.     exit 1
  68. fi
  69. if [ x$ADDUSER != xt ]
  70. then
  71.     echo "$CMDNAME: $USER cannot delete users."
  72.     exit 1
  73. fi
  74. #
  75. # get the user name of the user to delete.  Make sure it exists.
  76. #
  77. if [ -z "$DELUSER" ]
  78. then
  79.     echo PG_OPT_DASH_N_PARAM "Enter name of user to delete ---> PG_OPT_BACKSLASH_C_PARAM"
  80.     read DELUSER
  81. fi
  82. QUERY="select usesysid from pg_user where usename = '$DELUSER'"
  83. RES=`$PSQL -c "$QUERY" template1`
  84. if [ $? -ne 0 ]
  85. then
  86.     echo "$CMDNAME: database access failed."
  87.     exit 1
  88. fi
  89. if [ ! -n "$RES" ]
  90. then
  91.     echo "$CMDNAME: user ""$DELUSER"" does not exist."
  92.     exit 1
  93. fi
  94. SYSID=`echo $RES | sed 's/ //g'`
  95. #
  96. # destroy the databases owned by the deleted user.  First, use this query
  97. # to find out what they are.
  98. #
  99. QUERY="select datname from pg_database where datdba = '$SYSID'::oid"
  100.        
  101. ALLDBS=`$PSQL -c "$QUERY" template1`
  102. if [ $? -ne 0 ]
  103. then
  104.     echo "$CMDNAME: database access failed - exiting..."
  105.     exit 1
  106. fi
  107. #
  108. # don't try to delete template1!
  109. #
  110. for i in $ALLDBS
  111. do
  112.     if [ $i != "template1" ]
  113.     then
  114.         DBLIST="$DBLIST $i"
  115.     fi
  116. done
  117. if [ -n "$DBLIST" ]
  118. then
  119.     echo "User $DELUSER owned the following databases:"
  120.     echo $DBLIST
  121.     echo
  122. #
  123. # Now we warn the DBA that deleting this user will destroy a bunch of databases
  124. #
  125.     yn=f
  126.     while [ "$yn" != y -a "$yn" != n ]
  127.     do
  128.         echo PG_OPT_DASH_N_PARAM "Deleting user $DELUSER will destroy them. Continue (y/n)? PG_OPT_BACKSLASH_C_PARAM"
  129.         read yn
  130.     done
  131.     if [ $yn = n ]
  132.     then
  133.         echo "$CMDNAME: exiting"
  134.         exit 1
  135.     fi
  136.     #
  137.     # now actually destroy the databases
  138.     #
  139.     for i in $DBLIST
  140.     do
  141.         echo "destroying database $i"
  142.         QUERY="drop database $i"
  143.         $PSQL -c "$QUERY" template1
  144.         if [ $? -ne 0 ]
  145.         then
  146.             echo "$CMDNAME: drop database on $i failed - exiting"
  147.             exit 1
  148.         fi
  149.     done
  150. fi
  151. QUERY="delete from pg_shadow where usename = '$DELUSER'"
  152. $PSQL -c "$QUERY" template1
  153. if [ $? -ne 0 ]
  154. then
  155.     echo "$CMDNAME: delete of user $DELUSER was UNSUCCESSFUL"
  156. else
  157.     echo "$CMDNAME: delete of user $DELUSER was successful."
  158. fi
  159. exit 0