小编tin*_*lyx的帖子

授予权限

我有一个数据库角色、-login 和用户

CREATE LOGIN dummyLogIn WITH PASSWORD = 'dummyPassword', CHECK_POLICY = OFF;
CREATE USER dummyUser FOR LOGIN dummyLogIn;
CREATE ROLE "dummyRole";
Run Code Online (Sandbox Code Playgroud)

与角色相关的用户:

EXECUTE sp_addrolemember N'dummyRole', N'dummyUser';
Run Code Online (Sandbox Code Playgroud)

一切都很好。

现在我将 select WITH GRANT OPTION 授予指定表的组:

GRANT SELECT ON "dbo"."mytable" TO dummyRole WITH GRANT OPTION;
Run Code Online (Sandbox Code Playgroud)

仍然一切正常。如果我在 ssms 中查找角色的首选项,我会看到“dummyUser”是该角色的成员,并且该角色对 myTable 具有 SELECT 权限,包括授予选择的权限(两个复选框都在首选项窗口中进行了标记)

如果我尝试向另一个组授予选择权限,该权限肯定存在,我会收到一条错误消息(没有 15151):无法搜索对象“myTable”,因为对象不存在或必要的权限不存在。(错误消息是德语;))。

我可以轻松地在上述表格上进行选择 - 所以我假设该对象确实存在。在我看来,我应该能够向另一个组授予选择权限。

@附加:

引发错误的查询:

GRANT SELECT ON "dbo"."mytable" TO childDummyRole(以用户dummyUser登录)

childDummyRole 和引用对象的创建方式与上述对象相同:

CREATE LOGIN childDummyLogIn WITH PASSWORD = 'childDummyPassword', CHECK_POLICY = …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008

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

SQL Server 线程状态

我们的 SQL 配置为最多使用 704 个线程,有时我们会收到警告,指出只剩下 10 个线程,所以我无法理解 SQL 是否保持线程打开,因为再次创建新线程的成本很高。

所以我的问题是

  1. 如何知道线程是否可用于新请求或当前正忙于其他请求。

  2. 我正在尝试task_address从 sys.dm_exec_requests 与 sys.dm_os_tasks链接,worker_address如下所示

    select * from sys.dm_exec_requests ec
    join
    sys.dm_os_tasks tsk
    on tsk.task_state=ec.task_address
    join
    sys.dm_os_workers wrk
    on wrk.worker_address=tsk.worker_address
    
    Run Code Online (Sandbox Code Playgroud)

我没有看到任何输出,这是否意味着我可以假设所有线程都是空闲的

  1. 目前下面是我的工作线程的状态,这个挂起是什么意思?我可以看到计数超过 500 的挂起状态。我没有看到任何阻塞

在此处输入图片说明

4.我可以使用下面的查询来发现我有工作线程饥饿吗

select status from sys.dm_Exec_requests
Run Code Online (Sandbox Code Playgroud)

如果状态为挂起,我可以假设 SQL 正在等待新的工作线程

  1. 目前我看到一个会话,在 sysprocesses 中有超过 250 行,当我查询时sys.dm_os_Waiting_tasks,我可以看到超过 2186 行,其中 90% 是针对同一个会话。所以我的问题是查询如何跨越这么多线程

在此处输入图片说明

  1. 我会使用下面的查询获得可用的工人数量,这是正确的吗?

    select (
            select max_workers_count
            from sys.dm_os_sys_info
            ) - (
            select sum(active_workers_count)
            from sys.dm_os_Schedulers
            )
    
    Run Code Online (Sandbox Code Playgroud)

sql-server

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

递归 CTE 中的自联接:`递归引用不能出现多次`?

这是用 PostgreSQL 9.6 测试过的,但这是一个通用的 SQL 问题。

是否可以在递归 CTE (rCTE) 中使用递归表的自联接?

我尝试了以下包含递归项自联接的 rCTE x

WITH RECURSIVE
x (id) AS (
  SELECT 1 id UNION ALL SELECT x1.id+x2.id FROM x x1, x x2
  WHERE x1.id < 5 AND x2.id < 5 AND x1.id = x2.id
  )
SELECT * FROM x;
Run Code Online (Sandbox Code Playgroud)

,希望应该等同于:

WITH RECURSIVE
x (id) AS (
  SELECT 1 id UNION ALL SELECT id+id FROM x WHERE id < 5
  )
SELECT * FROM x;
Run Code Online (Sandbox Code Playgroud)

但是之前的 rCTE 会产生一个错误:

ERROR:  recursive reference …
Run Code Online (Sandbox Code Playgroud)

postgresql recursive postgresql-9.6 self-join

6
推荐指数
2
解决办法
1494
查看次数

Ubuntu 17.10 的 postgresql 10 有技巧吗?

PostgreSQL 10 在 Ubuntu 17.10 上可用吗?

我检查了 APT 上的文件夹是否确实存在:http : //apt.postgresql.org/pub/repos/apt/dists/artful-pgdg/10/

但是在我这样做之后:

sudo add-apt-repository "deb http://apt.postgresql.org/pub/repos/apt/ artful-pgdg main"
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo apt-get update
sudo apt-get install postgresql-10
Run Code Online (Sandbox Code Playgroud)

我收到一个错误:

Reading package lists... Done
Building dependency tree       
Reading state information... Done
E: Unable to locate package postgresql-10
Run Code Online (Sandbox Code Playgroud)

上述步骤适用于 Ubuntu 16.04(带有xenial-pgdg),但不适用于 17.10。

任何指针?

postgresql ubuntu postgresql-10

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

PL/pgSQL regclass 引用名为 like 关键字的表

我想通过在现有表名的基础上附加后缀来创建一个新表名。Postgres 9.5 PL/pgSQL 函数获取作为regclass类型传入的现有表名,并以字符串形式返回新名称。我format()用来构造新名称,通常会使用%I占位符。只要传入的表名不匹配任何 PL/pgSQL 关键字,这就会起作用。在这种情况下,无论我选择(%I%s)什么类型的组件,引用都是错误的。

考虑以下函数:

CREATE OR REPLACE FUNCTION make_name(old_name regclass)
RETURNS text                                           
LANGUAGE plpgsql AS                                    
$$                                                     
BEGIN                                                  
    RETURN format('%I_new', old_name);                 
END;                                                   
$$;                                                    
Run Code Online (Sandbox Code Playgroud)

进一步假设有两个表:treenodeoverlay。为这两个函数调用此函数会产生以下新名称:

SELECT make_name('overlay'::regclass);
     make_name     
-------------------
 """overlay"""_new
(1 row)

SELECT make_name('treenode'::regclass);
  make_name   
--------------
 treenode_new
(1 row)
Run Code Online (Sandbox Code Playgroud)

事实证明overlay它也是一个 PL/pgSQL 函数(就像format,但treenode不是),它似乎改变了引用行为。如果%s与 一起使用format(),结果将是"overlay"_new。当我使用||运算符时也会发生同样的情况。如果我使用text作为输入参数类型,一切都按预期工作,但我更喜欢使用regclass.

有没有办法用不带引号的关键字匹配regclass表名(例如overlay …

postgresql syntax datatypes plpgsql regclass

5
推荐指数
1
解决办法
2087
查看次数

PostgreSQL:regclass/oid 列是否在备份中保留?

我有一个大表(审计),其中存储架构和表的关系 ID。这可以通过触发器使用 TG_RELID 方便地填充。它也很方便,因为我可以对它建立索引,并且索引会比我单独存储“模式”(文本)和“表”(文本)列并对它们建立索引要小。另外,我可以使用它进行查询WHERE relation_id = 'myschema:mytable'::regclass,它就可以工作。

我的问题是,这在备份/恢复方面是否“安全”(schema.table 在目标服务器中是否具有与源服务器中相同的 regclass/oid ?

我还应该注意其他问题吗?

postgresql backup restore postgresql-9.6 regclass

5
推荐指数
1
解决办法
750
查看次数

“(SELECT * FROM A)”的冗长?

这可能是一个新手问题。但有时,我发现有必要使用诸如(SELECT * FROM A)在 SQL 中进行关系代数之类的东西(而不是使用关系A本身)。

例如,尝试在工作时,UNION两种关系A,并B具有相同的结构,下面

SELECT * FROM (A UNION B) t;
Run Code Online (Sandbox Code Playgroud)

生成语法错误(使用 PostgreSQL 9.x)。

ERROR:  syntax error at or near "UNION"
Run Code Online (Sandbox Code Playgroud)

我不得不做

SELECT * FROM ((SELECT * FROM A) UNION (SELECT * FROM B)) t;
Run Code Online (Sandbox Code Playgroud)

我的问题是:

子查询的冗长性(SELECT * FROM A)在 SQL 语言中是否真的必要(或者我是否遗漏了一些更好的编写方式)?为什么这里不能直接使用A和关系B

(SELECT * FROM A)相当于A在关系代数?扩张(SELECT * FROM A)给我们带来了什么?什么时候需要长表格?

postgresql relational-algebra

5
推荐指数
1
解决办法
201
查看次数

如何在 PostgreSQL 中获取 regclass 类型表的模式名称?

在编写一个函数来测试表中是否col_name存在一列时_tbl,我想提取表的模式名称,该名称作为regclass参数传递给函数(为了安全??)。

CREATE OR REPLACE FUNCTION column_exists(_tbl regclass, col_name text)
  RETURNS bool AS
$func$
  SELECT EXISTS (
    SELECT 1 FROM information_schema.columns 
    WHERE table_schema=get_schema($1) 
      AND table_name=get_table($1) 
      AND column_name=$2
    );
$func$  LANGUAGE sql;
Run Code Online (Sandbox Code Playgroud)

所以如果表名是'staging.my_table'::regclass,我想staging从一个虚构的函数中获取get_schema

我可以用 eg 来实现这个功能split_part(_tbl::text, '.', 1)吗?

此外,是否保证表名_tbl在转换为文本时始终具有模式名称?(即不省略诸如public.

我对这种regclass类型不是很熟悉。我搜索但找不到如何提取模式名称,只想在重新发明轮子之前先询问。

postgresql catalogs system-tables regclass

5
推荐指数
2
解决办法
9478
查看次数

如何使用 format() 函数引用限定表名?

format我在使用下面示例中的函数正确引用表名时遇到一些问题。

CREATE OR REPLACE FUNCTION copy_table(_source_tbl regclass, _target_tbl text)
 RETURNS bool AS $func$
DECLARE query_str text; 
BEGIN
  query_str = format($fmt$ DROP TABLE IF EXISTS %1$I; CREATE TABLE %1$I AS (TABLE %s); $fmt$, _target_tbl, _source_tbl);
  EXECUTE query_str;
  RAISE NOTICE '%', query_str;
 RETURN True;
END $func$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

我的困境是我想引用输入表名称_target_tbl作为标识符(以避免 SQL 注入)。但是,给定完整的表名称ex.test1,这会导致架构部分ex.被视为表名称的一部分,并public."ex.test1"在默认public.架构中创建表,如下所示。

我应该如何在此处正确引用/格式化标识符?

=> SELECT copy_table('ex.test', 'ex.test1');
NOTICE:  table "ex.test1" does not exist, skipping
NOTICE:   DROP TABLE IF EXISTS "ex.test1"; CREATE TABLE …
Run Code Online (Sandbox Code Playgroud)

postgresql dynamic-sql plpgsql postgresql-10

5
推荐指数
1
解决办法
3448
查看次数

在 PostgreSQL 中使用聚合函数合并许多 jsonb 对象?

PostgreSQL 中是否有标准函数(从 12.x 开始)将数据库列中的许多 jsonb 对象连接或合并为单个 jsonb 对象?

我知道有一个|| 自 PostgreSQL 9.5 起合并两个jsonb 对象的运算符。但我需要从一列合并许多 jsonb 对象。除非我遗漏了什么,否则链接的文档似乎没有。

aggregate json postgresql-12

5
推荐指数
1
解决办法
1159
查看次数