小编Ben*_*hul的帖子

“创建用户”和“授予连接”在功能上是否相同?

我本身没有问题,但我注意到如果我向数据库中不存在的主体授予数据库权限,该权限会显示在 sys.database_permissions 中,但用户无法连接到数据库(如预期)。如果我再给grant connect用户,一切都很好。这让我想知道create user和 是否grant connect在功能上是等效的。也就是说,有什么额外的那create user确实是grant connect不?

sql-server

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

如何检查数据库主密钥加密是否有效?

我有一个场景,我将数据库从一台服务器恢复到另一台服务器。在源服务器上,数据库主密钥 (DMK) 使用密码和服务主密钥 (SMK) 进行加密。当我去将它恢复到新服务器时,行中sys.key_encryptions仍然说它是由 SMK 加密的。但事实并非如此,因为两台服务器之间的 SMK 不匹配。是否有任何编程方式来验证 DMK 确实使用此服务器的SMK 进行了加密?

sql-server encryption

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

内联表值函数与内联 sql

我在尝试调整内联表值函数时看到了一些奇怪的行为。具体来说,如果我使用函数的胆量,并使用与我调用函数时相同的参数,我会看到大约 3 倍的性能提升。所以像这样(大大简化):

create function dbo.FooToDate(@ToDate date)
returns table
as
return (

select f.a, f.b, b.c
    from dbo.[Foo] as f
    left join dbo.Bar as b
       on f.fId = b.fId
    where f.ToDate >= @ToDate

)
go
declare @ToDate date = '2012-12-21'

--runs in about 4 seconds
select f.a, f.b, b.c
from dbo.[Foo] as f
left join dbo.Bar as b
   on f.fId = b.fId
where f.ToDate >= @ToDate

--runs in about 12 seconds
select a, b, c from dbo.FooToDate(@ToDate)
Run Code Online (Sandbox Code Playgroud)

当我查看针对我的实际情况的查询计划时,整体形状大不相同。我对内联 TVF 的理解是优化器能够展开函数,所以这种行为对我来说有些奇怪。是否有一个简单(或不那么简单)的解释?

sql-server sql-server-2008-r2

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

具有执行方式、跨数据库查询和模块签名的存储过程安全性

我有一种情况,虽然我能够解决它(如重现所示),但我不明白。以下是重点

  • 两个数据库,ChainingSource 和 ChainDestination,两者都将跨数据库链接设置为 true
  • ChainingSource 中的存储过程通过EXEC(@sql)访问 ChainingDestination 中的表
  • 存储过程是用execute as子句定义的
  • 如果我尝试按原样执行该过程,它会说执行上下文的服务器主体无法访问 ChainingDestination
  • 所以我添加了一个证书和代码签名。也就是说,我将证书映射登录添加到服务器,将用户映射到每个数据库,并相应地向证书映射用户授予权限
  • 如果我保留该execute as条款,我会得到同样的错误。
  • 如果我删除该execute as条款,一切都很好。

这是我感到困惑的倒数第二点。或者,具体地,为什么一个不工作,最后一个


/******************************

            Setup

******************************/
USE [master];
go
IF EXISTS (SELECT 1 FROM [sys].[databases] WHERE [name] = 'ChainingSource')
BEGIN
    ALTER DATABASE [ChainingSource] SET OFFLINE WITH ROLLBACK IMMEDIATE;
    ALTER DATABASE [ChainingSource] SET ONLINE;
    DROP DATABASE [ChainingSource];
END
IF EXISTS (SELECT 1 FROM [sys].[databases] WHERE [name] = 'ChainingDestination')
BEGIN
    ALTER DATABASE [ChainingDestination] SET OFFLINE WITH …
Run Code Online (Sandbox Code Playgroud)

security sql-server signature certificate impersonation

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

服务代理队列的状态

查看 sys.service_queues DMV,我看到有名为“is_enqueue_enabled”和“is_receive_enabled”的列。但是,在“ALTER QUEUE”DDL 中,似乎只有一个可以切换的“STATUS”。同样,在队列的 SMO 中,似乎只有“IsEnqueueEnabled”属性。我的问题是: is_enqueue_enabled 和 is_receive_enabled 是否总是具有相同的值?如果没有,如何独立设置它们?

sql-server service-broker

4
推荐指数
1
解决办法
2830
查看次数

GROUP BY 子句中的条件选择

我是一个 SQL 初学者,遇到了以下问题。考虑一个包含国家、该国家内的城市及其人口数据的表格:

CREATE TABLE cities (
    country VARCHAR(20),
    city VARCHAR(20),
    population INT
);

INSERT INTO cities VALUES
   ('Italy', 'Milano', 1000000), 
   ('Italy', 'Rome', 2000000), 
   ('Italy', 'Bologna', 800000), 
   ('Poland', 'Warszawa', 1000000), 
   ('Poland', 'Wroclaw', 700000);
Run Code Online (Sandbox Code Playgroud)

我想编写一个查询,返回国家/地区名称及其最大城市的人口和城市名称本身。前两个字段使用 很简单GROUP BY。但是,我不知道如何包含最大城市的名称。我试过:

SELECT 
    country, MAX(population), city
FROM
    cities
WHERE
    population = (SELECT 
            MAX(population)
        FROM
            cities
        )
GROUP BY country, city;
Run Code Online (Sandbox Code Playgroud)

但这只选择了一项记录(有关罗马的记录)。我希望查询为每个国家/地区组返回一条记录,即本例中为罗马和华沙。条件WHERE不能是:

population = (SELECT 
            MAX(population)
        FROM
            cities
        GROUP BY country)
Run Code Online (Sandbox Code Playgroud)

因为这样子查询返回两行,导致主查询中出现错误1242。

mysql group-by greatest-n-per-group mysql-8.0

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