小编alx*_*x9r的帖子

为什么不允许组拥有数据库?哪个用户应该拥有数据库?

根据微软“SQL Server 数据库的 ALTER AUTHORIZATION”

对新主人的要求:

新的所有者委托人必须是以下之一:

  • SQL Server 身份验证登录。
  • 代表 Windows 用户(不是组)的 Windows 身份验证登录。
  • 通过代表 Windows 组的 Windows 身份验证登录进行身份验证的 Windows 用户。

显然一个组不能拥有一个数据库。确实调用

alter authorization on database::MyDatabase to [domainname\SQLServerAdminGroup]
Run Code Online (Sandbox Code Playgroud)

结果在消息中

数据库类型的实体不能由角色、组、approle 或映射到证书或非对称密钥的主体拥有。

例如,让 SQL 管理员的 Windows 安全组的单个成员成为数据库所有者似乎很容易受到该帐户被废弃的影响。在这个问题中,这似乎是所有者员工离开公司时发生的事情。 此答案将数据库所有权作为 NT 主要主体的问题总结如下:

将数据库所有权默认为 NT 主要主体会产生一个包含问题(所有者是由 AD 管理的 NT SID,并且不会随数据库文件一起移动,NT 帐户可能会被指纹等)。

我是 SQL Server 管理的新手,与例如文件的所有权相比,只有主要主体才能成为所有者的限制很突出。根据微软“如何分配和更改所有者”

默认情况下,新对象的所有者是在附加到创建过程的访问令牌中标识为默认所有者的安全主体。...当用户是管理员组或域管理员组的成员时,会发生唯一的例外。在这两种情况下,用户访问令牌中的所有者字段包含组的 SID,而不是单个用户帐户的 SID。假设管理帐户仅用于管理系统,而不用于任何个人目的。因此,由一个管理员创建的对象可以由同一组中的其他管理员管理。

换句话说,

  • 对于管理员创建的文件文件默认所有者是,而
  • 对于数据库,所有者不能是组。

这给我留下了以下问题:

  1. 数据库不能由次要主体拥有是否存在根本原因?
  2. 哪个主体应该拥有一个数据库?有最佳实践吗?如果是这样,该最佳实践背后的原因是什么?

sql-server windows permissions access-control

13
推荐指数
2
解决办法
2359
查看次数

如何使用这种模式有效地遍历图形数据?

我有一些体现有向无环图的关系,其中包括类似于以下内容的模式:

在此输入图像描述

我正在寻找一种有效的方法来遍历此图形数据。下面是计算节点 0 的后代的看似简单任务的示例:

数据库<>小提琴

DROP TABLE IF EXISTS #edges;
CREATE TABLE #edges(tail int, head int);
INSERT INTO #edges(tail,head) VALUES
    (0,1), (5, 6),  (10,11), (15,16),
    (0,2), (5, 7),  (10,12), (15,17),
    (1,2), (6, 7),  (11,12), (16,17),
    (1,3), (7, 8),  (11,13), (17,18),
    (2,3), (7, 9),  (12,13), (17,19),
    (2,4), (8, 9),  (12,14), (18,19),
    (3,4), (8,10),  (13,14),
    (3,5), (9,10),  (13,15),
    (4,5), (9,11),  (14,15),
    (4,6),          (14,16);
WITH descendents(node)
AS(
    SELECT 0 as node
    UNION ALL
    SELECT head as node FROM descendents as prior
    JOIN #edges …
Run Code Online (Sandbox Code Playgroud)

sql-server cte graph recursive

8
推荐指数
1
解决办法
373
查看次数

为什么值的长度有时是列的宽度而不是字符串的长度?

考虑以下 SQL

DECLARE @JSON VARCHAR(max);
DECLARE @t AS TABLE(
    field  char(32),
    len1   int,
    nfield nchar(32),
    nlen1  int,
    vfield varchar(32),
    vlen1  int
);

SET @JSON = '[
    { "Field" : "abcd" }
]'
INSERT INTO @t
SELECT
    Field      as field,
    Len(Field) as len1,
    Field      as nfield,
    Len(Field) as nlen1,
    Field      as vfield,
    Len(Field) as vlen1
FROM OPENJSON (@JSON)
WITH ( Field nchar(32) );

INSERT INTO @t ( field , len1       ,nfield, nlen1      ,vfield, vlen1      )
VALUES         ( 'efgh', len('efgh'),'efgh', len('efgh'),'efgh', len('efgh')) …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2017

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