小编Joh*_*ohn的帖子

PostgreSQL 角色与用户,授予权限

我目前正在学习 PostgreSQL 和 MySQL 之间的差异,因为我有一个新项目,而且我还打算将我现有的软件从 MySQL 迁移到 PostgreSQL。我实际上已经开始创建一个 HTML 表,比较两者之间的命令(用于用户/数据库/命令提示符等)。在阅读了这里的答案后,我注意到它role似乎被用作一个组。与MySQL我有两个用户,基本公共(DELETEINSERTSELECTUPDATE权限),并与一对夫妇的额外权限的管理员用户。

所以基本上在 Windows 7 命令提示符下(仅限本地开发)...

  • 角色是特定于 PostgreSQL 的用户、组或松散使用的术语吗?
  • 对于数据库中的所有表,如何仅向特定用户授予特定权限?
  • 如何将数据库中所有表的所有权限授予特定用户?
  • 在使用GRANTREVOKE获得用户权限时,角色与用户相比如何(如果有的话)?

postgresql users

33
推荐指数
1
解决办法
2万
查看次数

复制具有单独序列的连续列的表

在创建列管理工具时,我遇到了在 PostgreSQL 中快速复制表的需要,因此我不会使用非测试表来测试新工具。为了有效地测试我最终打算在表上使用的新列工具,parts我创建了这个新工具来复制parts,这样我最终会得到一个parts1表。当我以为我终于解决了所有问题时,当列工具删除表时,我遇到了以下错误:

错误:无法删除表部分,因为其他对象依赖于它详细信息:表 parts1 列 id 的默认值取决于序列 parts_id_seq1

我花了一天的大部分时间来研究这个解决方案,所以简而言之,我可以简单地使用字符串函数来重命名变量以将表与表SEQUENCE_NAME分离,还是这是一个比这更复杂的问题?这是查询:partsparts

DO $$
  DECLARE
    SEQUENCE_NAME VARCHAR;
  BEGIN
    SELECT s.relname INTO SEQUENCE_NAME
    FROM pg_class AS s JOIN pg_depend d ON d.objid = s.oid 
    INNER JOIN pg_class AS t ON d.objid = s.oid AND d.refobjid = t.oid 
    INNER JOIN pg_attribute AS a ON (d.refobjid, d.refobjsubid) = (a.attrelid, a.attnum) 
    INNER JOIN pg_namespace AS n ON n.oid = s.relnamespace 
    WHERE s.relkind = 'S' …
Run Code Online (Sandbox Code Playgroud)

postgresql database-design primary-key sequence dynamic-sql

6
推荐指数
1
解决办法
7642
查看次数

PostgreSQL SELECT 主键为“串行”或“大串行”

我已经啮合在一起的方式来确定什么data_type是在data_type创建基于掀起了新表时,你的语法使用PostgreSQL的维基页面。

如果我的查询有问题,我需要真正知道在给定场景中什么会在显式上下文中抛出它在纯粹的测试数据库/表上运行一个或多个查询以修改该数据库/表,所以运行这个查询以测试任何误报。

SELECT pg_attribute.attname, 
format_type(pg_attribute.atttypid, pg_attribute.atttypmod),
CASE 
WHEN format_type(pg_attribute.atttypid, pg_attribute.atttypmod)='bigint' THEN 'bigserial'
WHEN format_type(pg_attribute.atttypid, pg_attribute.atttypmod)='integer' THEN 'serial'
END AS type
FROM pg_index, pg_class, pg_attribute 
WHERE pg_class.oid = 'delete2'::regclass 
AND indrelid = pg_class.oid 
AND pg_attribute.attrelid = pg_class.oid 
AND pg_attribute.attnum = any(pg_index.indkey) 
AND indisprimary;
Run Code Online (Sandbox Code Playgroud)

这是一个带有主键的表,该表不使用此查询返回主键:

CREATE TABLE delete_key_bigserial (
  test1 integer,
  id bigserial NOT NULL,
  col1 text,
  col2 text,
  test2 integer
);
Run Code Online (Sandbox Code Playgroud)

postgresql primary-key datatypes sequence catalogs

3
推荐指数
1
解决办法
5863
查看次数

使用动态 SQL 重置串行 PK 的顺序

如何使用字符串和DECLARE变量的组合动态引用序列名称(如下所示)?下面的代码是否正确或者是否有其他方法可以做到这一点?

DO我的目标是出于性能原因在/块中执行此操作BEGIN,而且它将通过做一些有用的事情来帮助我理解 plpgsql,因此除非确实必须,否则我不会将其混合到 PHP 中。

DO $$
 DECLARE PKEY VARCHAR;
BEGIN

SELECT pg_attribute.attname INTO PKEY 
FROM pg_index, pg_class, pg_attribute 
WHERE pg_class.oid = 'parts1'::regclass 
AND indrelid = pg_class.oid 
AND pg_attribute.attrelid = pg_class.oid 
AND pg_attribute.attnum = any(pg_index.indkey) 
AND indisprimary;

--SELECT setval('parts1_id_seq', (SELECT MAX(pkey) + 1 FROM parts));
SELECT setval('parts1_' || PKEY || '_seq', (SELECT MAX(pkey) + 1 FROM parts));

  END;
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

postgresql auto-increment dynamic-sql plpgsql

3
推荐指数
1
解决办法
1888
查看次数

PostgreSQL 在 data_type 设置为 ARRAY 时确定列类型

我遇到了一个奇怪的地方,PostgreSQL在表中设置了data_typeto 。我做了以下查询以获得一些见解:ARRAYinformation_schema.columns

SELECT * FROM information_schema.columns 
WHERE table_schema NOT IN ('pg_catalog', 'information_schema') 
AND table_name='__table_name__';
Run Code Online (Sandbox Code Playgroud)

我注意到了该udt_name列,想知道它是否是确定该列数据是什么类型的数组的可靠方法?

SELECT column_name, data_type, udt_name FROM information_schema.columns 
WHERE table_schema NOT IN ('pg_catalog', 'information_schema') 
AND table_name='__table_name__';
Run Code Online (Sandbox Code Playgroud)

postgresql postgresql-9.3

2
推荐指数
1
解决办法
1734
查看次数