我有一个数据库角色、-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 配置为最多使用 704 个线程,有时我们会收到警告,指出只剩下 10 个线程,所以我无法理解 SQL 是否保持线程打开,因为再次创建新线程的成本很高。
所以我的问题是
如何知道线程是否可用于新请求或当前正忙于其他请求。
我正在尝试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)我没有看到任何输出,这是否意味着我可以假设所有线程都是空闲的
4.我可以使用下面的查询来发现我有工作线程饥饿吗
select status from sys.dm_Exec_requests
Run Code Online (Sandbox Code Playgroud)
如果状态为挂起,我可以假设 SQL 正在等待新的工作线程
sys.dm_os_Waiting_tasks,我可以看到超过 2186 行,其中 90% 是针对同一个会话。所以我的问题是查询如何跨越这么多线程我会使用下面的查询获得可用的工人数量,这是正确的吗?
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)这是用 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 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。
任何指针?
我想通过在现有表名的基础上附加后缀来创建一个新表名。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)
进一步假设有两个表:treenode和overlay。为这两个函数调用此函数会产生以下新名称:
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 …
我有一个大表(审计),其中存储架构和表的关系 ID。这可以通过触发器使用 TG_RELID 方便地填充。它也很方便,因为我可以对它建立索引,并且索引会比我单独存储“模式”(文本)和“表”(文本)列并对它们建立索引要小。另外,我可以使用它进行查询WHERE relation_id = 'myschema:mytable'::regclass,它就可以工作。
我的问题是,这在备份/恢复方面是否“安全”(schema.table 在目标服务器中是否具有与源服务器中相同的 regclass/oid ?
我还应该注意其他问题吗?
这可能是一个新手问题。但有时,我发现有必要使用诸如(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)给我们带来了什么?什么时候需要长表格?
在编写一个函数来测试表中是否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类型不是很熟悉。我搜索但找不到如何提取模式名称,只想在重新发明轮子之前先询问。
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 中是否有标准函数(从 12.x 开始)将数据库列中的许多 jsonb 对象连接或合并为单个 jsonb 对象?
我知道有一个|| 自 PostgreSQL 9.5 起合并两个jsonb 对象的运算符。但我需要从一列合并许多 jsonb 对象。除非我遗漏了什么,否则链接的文档似乎没有。
postgresql ×7
regclass ×3
plpgsql ×2
aggregate ×1
backup ×1
catalogs ×1
datatypes ×1
dynamic-sql ×1
json ×1
recursive ×1
restore ×1
self-join ×1
sql-server ×1
syntax ×1
ubuntu ×1