我本身没有问题,但我注意到如果我向数据库中不存在的主体授予数据库权限,该权限会显示在 sys.database_permissions 中,但用户无法连接到数据库(如预期)。如果我再给grant connect用户,一切都很好。这让我想知道create user和 是否grant connect在功能上是等效的。也就是说,有什么额外的那create user确实是grant connect不?
我有一个场景,我将数据库从一台服务器恢复到另一台服务器。在源服务器上,数据库主密钥 (DMK) 使用密码和服务主密钥 (SMK) 进行加密。当我去将它恢复到新服务器时,行中sys.key_encryptions仍然说它是由 SMK 加密的。但事实并非如此,因为两台服务器之间的 SMK 不匹配。是否有任何编程方式来验证 DMK 确实使用此服务器的SMK 进行了加密?
我在尝试调整内联表值函数时看到了一些奇怪的行为。具体来说,如果我使用函数的胆量,并使用与我调用函数时相同的参数,我会看到大约 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 的理解是优化器能够展开函数,所以这种行为对我来说有些奇怪。是否有一个简单(或不那么简单)的解释?
我有一种情况,虽然我能够解决它(如重现所示),但我不明白。以下是重点
EXEC(@sql)访问 ChainingDestination 中的表execute as子句定义的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) 查看 sys.service_queues DMV,我看到有名为“is_enqueue_enabled”和“is_receive_enabled”的列。但是,在“ALTER QUEUE”DDL 中,似乎只有一个可以切换的“STATUS”。同样,在队列的 SMO 中,似乎只有“IsEnqueueEnabled”属性。我的问题是: is_enqueue_enabled 和 is_receive_enabled 是否总是具有相同的值?如果没有,如何独立设置它们?
我是一个 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。
sql-server ×5
certificate ×1
encryption ×1
group-by ×1
mysql ×1
mysql-8.0 ×1
security ×1
signature ×1