powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как установить запрет на использование поля в качестве первичного ключа
14 сообщений из 14, страница 1 из 1
Как установить запрет на использование поля в качестве первичного ключа
    #39190865
sanringo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть поле number. Как можно запретить это поле на использование в качестве первичного ключа? Если такое вообще возможно
...
Рейтинг: 0 / 0
Как установить запрет на использование поля в качестве первичного ключа
    #39190869
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sanringoЕсть поле number. Как можно запретить это поле на использование в качестве первичного ключа? Если такое вообще возможно

Никак. А главное не понятно зачем? Задача не понятна.
Или вы занимаетесь дизайном базы и тогда не ясно зачем от себя замок ставить или не вы и тогда это не ваша головная боль.

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
Как установить запрет на использование поля в качестве первичного ключа
    #39190872
sanringo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Именно это и нужно
>от себя замок ставить
Таковы условия задачи, придуманные не мной.
...
Рейтинг: 0 / 0
Как установить запрет на использование поля в качестве первичного ключа
    #39190882
sanringo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ещё вопрос. Создал последовательность для поля number
Код: plsql
1.
2.
3.
4.
5.
6.
CREATE SEQUENCE "public"."number_seq"
 INCREMENT 1
 MINVALUE 1
 MAXVALUE 9223372036854775807
 RESTART 1
 CACHE 1;



Создал таблицу
Код: plsql
1.
2.
3.
4.
5.
CREATE TABLE "public"."my_table" (
"number" int4 DEFAULT nextval('number_seq'::regclass) NOT NULL,
"name" TEXT
)
WITH (OIDS=FALSE)



Номер должен формироваться минимальным из незанятых. Подойдёт ли для этого созданная последовательность?
Как установить запрет на INSERT, UPDATE пользователем? Т.е. чтобы нельзя было сделать
Код: plsql
1.
2.
INSERT INTO my_table ("number", "name") VALUES ('10', "fff");
UPDATE my_table SET "number" = '10' WHERE "number" = '10';
...
Рейтинг: 0 / 0
Как установить запрет на использование поля в качестве первичного ключа
    #39190883
big-trot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sanringo,

Станьте владельцем этого объекта. И никто кроме вас не сможет изменить его структуру.
...
Рейтинг: 0 / 0
Как установить запрет на использование поля в качестве первичного ключа
    #39190888
sanringo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужно, чтобы даже владелец не смог
...
Рейтинг: 0 / 0
Как установить запрет на использование поля в качестве первичного ключа
    #39190891
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sanringoТаковы условия задачи, придуманные не мной.
что мешает сменить работодателя?
...
Рейтинг: 0 / 0
Как установить запрет на использование поля в качестве первичного ключа
    #39190918
sanringo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо откликнувшимся. На доп вопросы, думаю правильнее создать отдельные темы
...
Рейтинг: 0 / 0
Как установить запрет на использование поля в качестве первичного ключа
    #39190956
Alexius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sanringo,

обычно такого рода задачи решаются разграничением прав. владелец объектов привелигированный пользователь, все миграции в схему выполняются от него.
а приложениям/конечным пользователям/особо одаренным постановщикам задач выдаются только нужные права(роли) на чтение/запись. в более сложных случаях доступ оставляют через хранимки.

как это делается - см. документацию по командам grant/revoke, alter default privileges.
...
Рейтинг: 0 / 0
Как установить запрет на использование поля в качестве первичного ключа
    #39190957
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sanringoКак можно запретить это поле на использование в качестве первичного ключа?
Сделайте его nullable. На таких полях ПК не строится.
...
Рейтинг: 0 / 0
Как установить запрет на использование поля в качестве первичного ключа
    #39190962
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovsanringoКак можно запретить это поле на использование в качестве первичного ключа?
Сделайте его nullable. На таких полях ПК не строится.
+1
гениально)).
...
Рейтинг: 0 / 0
Как установить запрет на использование поля в качестве первичного ключа
    #39191006
Павел Лузанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sanringoЕсть поле number. Как можно запретить это поле на использование в качестве первичного ключа? Если такое вообще возможно
В 9.5 такое можно сделать на триггерах событий, где появилась удобная функция pg_event_trigger_ddl_commands().
Триггер на событие ddl_command_end очевидно срабатывает в конце каждой DDL команды.
Нам важно, что в этот момент системный каталог уже обновился и из триггера в эти обновления можно заглянуть.
Первичный ключ создается командами CREATE TABLE или ALTER TABLE.
Соответственно для этих команд нужно ругаться в случае появления столбца с неправильным типом данных в первичном ключе.

Примерно так. В качестве плохого типа взял numeric:
Код: sql
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.
create function f_check_pk ()
   returns event_trigger
   language plpgsql
as $$
declare
   r record;
   l_col name;
begin
   for r in (select * from pg_event_trigger_ddl_commands())
   loop
      if r.command_tag in ('CREATE TABLE', 'ALTER TABLE')
      then
         select a.attname into l_col
           from pg_attribute a
          where a.atttypid::regtype::text in ('numeric')
            and (a.attrelid, a.attnum) in (
                   select c.conrelid, unnest(c.conkey)
                     from pg_constraint c
                    where c.contype = 'p' and c.conrelid = r.objid::regclass
          )
         limit 1;
         if found
         then
            raise exception 'Using numeric column (%) for primary key not allowed', l_col;
         end if;
      end if;
   end loop;
end;
$$;

create event trigger et_check_pk
   on ddl_command_end
   execute procedure f_check_pk();

\echo Testing create table ...
create table t1 (c1 numeric, c2 text, constraint t1_pk primary key (c1,c2));
create table t2 (c1 text, c2 numeric);
\echo Testing alter table ...
alter table t2 add constraint t2_pk primary key (c1, c2);
drop table t2;
...
Рейтинг: 0 / 0
Как установить запрет на использование поля в качестве первичного ключа
    #39191040
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел Лузанов,

Только владелец легко этот триггер дропнет или отключит временно если ему будет очень надо.

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
Как установить запрет на использование поля в качестве первичного ключа
    #39191065
Павел Лузанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Максим,

Владельца таблиц и владельца триггера нужно развести.
Например, триггер создавать из под суперпользователя, а таблицы из под обычного пользователя.
Тогда владелец таблиц не сможет удалить триггер.

Кстати, я не обратил внимание, что number это оказывается имя столбца, а не тип данных.
Впрочем правка функции минимальная.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как установить запрет на использование поля в качестве первичного ключа
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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