Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / dump пользователей / 13 сообщений из 13, страница 1 из 1
20.12.2006, 15:41
    #34213710
Алексей Ключников
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dump пользователей
Так получилось, что база завязана на OID пользователей.
пользователи создавались путем create user...
теперь при dump/restore возникает проблема с пользователями.
Таблицу pg_user дампить не выходит...

Есть какой то правильный путь dump/restore users with oids?
...
Рейтинг: 0 / 0
20.12.2006, 16:28
    #34213904
postuser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dump пользователей
А как тогда правильно создавать (чтобы при дампе сохранялись)? Создаю
Код: plaintext
CREATE USER user1 WITH PASSWORD 'passwd' ;
в psql.
...
Рейтинг: 0 / 0
20.12.2006, 17:58
    #34214194
st_serg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dump пользователей
pg_dumpall -g
?
...
Рейтинг: 0 / 0
20.12.2006, 18:23
    #34214268
st_serg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dump пользователей
сори, поспешил, oid'ов там не будет.
а как вы будете создавать пользователя с определенным oid? в доках по create user/role ничего не нашел подходящего кроме
doc
SYSID uid
The SYSID clause is ignored, but is accepted for backwards compatibility.
...
Рейтинг: 0 / 0
21.12.2006, 08:27
    #34214971
glebofff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dump пользователей
В этом и беда - в отсутствии уникальности OID. Завязываться надо, видимо, на логин.
...
Рейтинг: 0 / 0
21.12.2006, 10:13
    #34215183
glebofff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dump пользователей
И вот такие ещё проблемы:
http://archives.postgresql.org/pgsql-bugs/2006-09/msg00187.php
...
Рейтинг: 0 / 0
21.12.2006, 23:18
    #34217387
Shweik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dump пользователей
1) pg_user - не таблица а view вида и просмотрев его исходники можно рискнуть
сделать pg_dump -t pg_authid template1 а затем вкрутить его, но чем это чревато думаю объяснять нет надобности.
Думаю правильнее хотя и дольше - заменить во всех запросах обращение к pg_user на свою таблицу (скажем atsusers), в которую скопировать данные из pg_authid. Oid скопировать в поле скажем ausid и отрихтовать запросы.
3) Насчет "бага" ничего не ясно.... может автор просто забыл написать create table ddd () WITH oiDs; или написал set default_with_oids=false; а потом заорал "баг". По факту сейчас в 8.1.3/4
нормально все дампится и ресторится. Да таже pg_authid замечательно бакапится.
IMHO oid сейчас реально используется не чаще чем скажем пресловутый goto. И привязываться к нему в глобальных вещах непростительно.
4) На _пустом_ кластере при создании пользователей сразуже после initdb можно получить полное совпадение usesysid. Для постгреса думаю везде он равен 10 ну а для первого пользователя созданного руками скороее всего будет 16384. Баг pg_dumpall в том что нужно дампить pg_authid
да и все системные таблицы ( вот это и есть дампить все!!! 8-) ), а не создавать в них объекты с непредсказуемыми oid. Опять таки все это всего IMHO.
...
Рейтинг: 0 / 0
22.12.2006, 01:26
    #34217455
Jelis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dump пользователей
А много чего "завязанно" уже? Может сделать отдельно свою таблицу с логинами и своими login_id и завязываться на нее?
...
Рейтинг: 0 / 0
22.12.2006, 07:28
    #34217593
glebofff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dump пользователей
Shweik
3) Насчет "бага" ничего не ясно.... может автор просто забыл написать create table ddd () WITH oiDs; или написал set default_with_oids=false; а потом заорал "баг". По факту сейчас в 8.1.3/4
нормально все дампится и ресторится. Да таже pg_authid замечательно бакапится.
IMHO oid сейчас реально используется не чаще чем скажем пресловутый goto. И привязываться к нему в глобальных вещах непростительно.


Речь об OID'ах классов. Вот было бы здорово, если бы они были всегда уникальными. Это просто мечта. :-) Т.е. человек использует идентификаторы для связки каких-то таблиц.

OIDы строк нормально дампятся-ресторятся, да. И то, там есть нюансы.
...
Рейтинг: 0 / 0
23.12.2006, 11:10
    #34220289
Алексей Ключников
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dump пользователей
В общем переделывать храниение пользователей..
Что то здесь не так с хранением пользователей в постгресе.

А завязались на oid что использовалось
select usesysid from pg_user where usename = (select current_user);
Но своевременно ре разобрались что usesysid есть не что иное как oid :(.
А на тот момент postgresql8.0, позволял явно задавать id пользователя,
в pgadmin была галочка - задать id пользователя.


кстати при pg_dumpall -o (-o with oids) usesysid`ы меняются :(.
...
Рейтинг: 0 / 0
23.12.2006, 17:55
    #34220623
ZemA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dump пользователей
Алексей КлючниковВ общем переделывать храниение пользователей..
Что то здесь не так с хранением пользователей в постгресе.

А завязались на oid что использовалось
select usesysid from pg_user where usename = (select current_user);
Но своевременно ре разобрались что usesysid есть не что иное как oid :(.
А на тот момент postgresql8.0, позволял явно задавать id пользователя,
в pgadmin была галочка - задать id пользователя.


кстати при pg_dumpall -o (-o with oids) usesysid`ы меняются :(.
вот скриптик на перле, им можно сделать дамп юзеров с usesysid
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
#!/usr/bin/perl -w
 use DBI;
 use strict;

 #Database connection 
 my $dbh=DBI->connect('DBI:Pg:dbname=БД','ЛОГИН','ПАРОЛЬ')
      or
       die "connecting: $DBI::errstr";

 my $sth=$dbh->prepare("select usename, passwd, usecreatedb, usesuper, usesysid from pg_shadow;");
 
 $sth->execute;

 print "\n -- Создание всех пользователей PostgreSql --\n";

 my %users;

 while(my @row=$sth->fetchrow)
  {
   my $nam   = $row[ 0 ];
   my $pas   = $row[ 1 ];
   my $credb = $row[ 2 ];
   my $super = $row[ 3 ];
   $users{$row[ 4 ]} = $row[ 0 ];

   if ($pas) {$pas = qq(WITH PASSWORD '$pas');} 

   if ($credb) {
         $credb = "CREATEDB";}
       else {
         $credb = "NOCREATEDB";}

   if ($super) {
         $super = "CREATEUSER";}
      else {
         $super = "NOCREATEUSER";}
  
   if ($pas) { print qq(CREATE USER $nam $pas $credb $super SYSID $row[ 4 ];\n);}
  }

 $sth=$dbh->prepare("select groname, grolist from pg_group where grolist is not null;");

 $sth->execute;

 print "\n -- Создание всех групп и распределение пользователей --\n";

 while(my @row=$sth->fetchrow)
  {
    my $groname = $row[ 0 ];
    my $grolist = $row[ 1 ];

    $grolist=~s/^\{(.+)\}$/$ 1 /;

    my @grolist=split /,/, $grolist;

    print qq(\nCREATE GROUP $groname;\n);

    foreach (@grolist) {
       my $username = $_;
    if ($username) { print qq( ALTER GROUP $groname ADD USER $users{$username};\n); }
    }
  }
 $dbh->disconnect;
подойдет? )
...
Рейтинг: 0 / 0
23.12.2006, 21:11
    #34220781
Shweik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dump пользователей
Проблема отсутствия правильного пути скорее вот в чем :
Код: plaintext
1.
2.
3.
SYSID uid

    The SYSID clause is ignored, but is accepted for backwards compatibility. 

Это из описания Create Role 8-( Так что вышеприведенный скрипт начиная с v 8.1.0 ( Create a new role system that replaces users and groups (Stephen Frost)) не поможет. Кажись поторопились г-да разработчики 8-(( .
Придется сделать в новую базу копию pg_authid (назовем ее скажем old_authid) а затем создав новых пользователей проапдейтить все таблицы основываясь на вьюшке
Код: plaintext
1.
2.
3.
4.
 create view syncoids as  SELECT a0.rolname as oldname,a0.oid as oldoid,a0.rolname as newname,a1.oid as newoid from  old_authid a0, pg_authid a1 where a0.rolname=a1.rolname ;

--- теперь  можно  сделать UPDATE ppps set p1=syncoids.newoid from syncoids where ppps.p1=oldoid;
---  понятно что  все роли должны быть  уже созданы в новой базе иначе ОЙ.

2glebofff
OID-ы неуникальны.... вот это новость 8-[]
всегда был убежден что в пределах базы OID уникален иначе смысл его непонятен.
А как же вот это - деза? Сноска 12.3 :
Код: plaintext
1.
Technically, OID's are unique among all databases sharing a common /data directory tree.
...
Рейтинг: 0 / 0
25.12.2006, 10:38
    #34221860
glebofff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dump пользователей
ShweikПроблема отсутствия правильного пути скорее вот в чем :
2glebofff
OID-ы неуникальны.... вот это новость 8-[]


Это не новость! :-)

Если серьёзно, то мне бы хотелось, чтобы при восстановлении БД из дампа восстанавливались и OID'ы таблиц, схем, объектов. Вот я о чём.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / dump пользователей / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]