我正在运行一个查询,该查询正在处理 XML 文档中的一些节点。我估计的子树成本以数百万计,似乎这一切都来自 SQL Server 对我通过 XPath 从 xml 列中提取的某些数据执行的排序操作。Sort 操作的估计行数约为 1900 万,而实际行数约为 800。查询本身运行得相当好(1 - 2 秒),但这种差异让我想知道查询性能以及为什么会这样差别这么大?
我有一个签名的存储过程,它创建一个新数据库、一个新登录名并将新用户分配为新数据库的所有者。那么我的存储过程会创建新的登录名和新数据库,但不会将新用户分配为新数据库的所有者。存储过程位于应用程序数据库中,而不是 master。
我得到的错误是:
找不到主体“BlahUser”,因为它不存在或您没有权限。
存储过程在具有有限权限(在存储过程上执行)的不同登录名 (simpleUser) 下执行。
证书用户具有以下权限:
有问题的代码是:
SET @sqlStmt = 'ALTER AUTHORIZATION ON DATABASE::'+@sessionid+'Data TO ['+@orgName+'User]'
SET @metasql = '
USE [master]
EXEC (''' + REPLACE(@sqlStmt, '''', '''''') + ''')
'
EXEC sp_executesql @metasql
Run Code Online (Sandbox Code Playgroud)
我尝试像这样将执行用户(simpleUser)的模拟授予存储过程中的新用户,但它也会导致错误。我不确定创建其他用户的用户是否可以自动模拟他们。
SET @sqlStmt = 'GRANT IMPERSONATE ON LOGIN::'+@orgName+'User TO simpleUser';
SET @metasql = '
USE [master]
EXEC (''' + REPLACE(@sqlStmt, '''', '''''') + ''')
'
EXEC sp_executesql @metasql
Run Code Online (Sandbox Code Playgroud) 我有另一个数据库 Ydb 访问数据库 Kdb 中的数据。他们都有相同的所有者。
为了允许跨数据库链接,我似乎需要在 Kdb 中启用来宾用户。
我是这样做的:
USE [master];
GO
ALTER DATABASE Ydb SET DB_CHAINING ON;
ALTER DATABASE Kdb SET DB_CHAINING ON;
GO
USE [Kdb]
GO
GRANT CONNECT TO guest;
Run Code Online (Sandbox Code Playgroud)
我意识到这意味着由 Ydb 的所有者创建的 Ydb 中的存储过程可以在由同一登录名创建时自由访问 Kdb 中的对象。这会开启什么样的攻击?