我有两个数据库服务器,通过链接服务器连接。两者都是 SQL Server 2008R2 数据库,链接服务器连接是通过常规“SQL Server”链接使用当前登录的安全上下文建立的。链接的服务器都在同一个数据中心,所以连接应该不是问题。
我使用以下查询来检查列的哪些值identifier
可远程使用,但不能在本地使用。
SELECT
identifier
FROM LinkedServer.RemoteDb.schema.[TableName]
EXCEPT
SELECT DISTINCT
identifier
FROM LocalDb.schema.[TableName]
Run Code Online (Sandbox Code Playgroud)
在两个表上的列上都有非聚集索引identifier
。本地大约有 260 万行,远程只有 54 行。然而,在查看查询计划时,70% 的执行时间用于“执行远程查询”。此外,在研究完整的查询计划时,估计的本地行数是1
而不是2695380
(这是仅选择后面的查询时的估计行数EXCEPT
)。
执行此查询时,确实需要很长时间。
不禁让人疑惑:这是为什么呢?估计是“刚刚”结束,还是链接服务器上的远程查询真的那么昂贵?
我们的一位客户将DECIMAL(18,0)
其 SQL Server 2008R2 数据库中的数据类型用于某些列。由于列增长非常缓慢,他最近提议将数据类型更改为DECIMAL(5,0)
以重新获得一些存储空间。
根据MSDN 库,DECIMAL(5,0)
数据类型的存储空间与数据类型一样DECIMAL(9,0)
,为 5 个字节。INT
小 1 个字节,但可以存储 -2^31 到 2^31 范围内的所有内容,而不是DECIMAL(5,0)
可以存储的 -99,999 到 99,999 。即使是最大的DECIMAL
5 个字节 ( DECIMAL(9,0)
) 也只能存储 -999,999,999 到 999,999,999 范围内的整数(不到INT
4 个字节提供的范围的一半)。
我可以想到使用DECIMAL
over的两个“好处” INT
:
但在我看来,这些并不是真正的好处:
这让我想知道:DECIMAL(5,0)
整数数据类型的额外好处是什么?
我想运行一个包含 Transfer SQL Server Objects 任务的 SSIS 包。涉及的服务器在同一个域中,但 SQL Server 服务在本地服务帐户上运行。所以环境看起来是这样的:
领域
服务器 1
服务器 2
为了能够登录到两台服务器,我创建了一个域帐户以用作服务帐户。当我使用这个域帐户登录到服务器1,然后从文件系统执行包时,每一步都成功。但是,当我尝试将作业添加到 SQL Server 时,我遇到了以下问题之一:
情况1.工作负责人:本地帐户;运行 SSIS 步骤作为域帐户的代理。当我将作业所有者设置为本地帐户,但将作业作为域帐户的代理运行时,作业本身将成功执行,但程序包会引发类似错误
执行失败,出现以下错误:“目录‘LocalApplicationData’不存在。”。
可以通过为服务器 1 上的域用户创建具有管理员权限的登录来修复此错误,但这显然不是理想的解决方案。将帐户添加到 SQL Server 代理/DTS 组之一也不起作用。
情况 2. 作业所有者:域帐户;运行 SSIS 步骤作为域帐户的代理。当我为域帐户的步骤设置作业所有者和“以用户身份运行”时,作业根本无法启动,并出现以下错误:
无法确定作业的所有者(域\域用户)
Job name
是否具有服务器访问权限(原因:无法获取有关 Windows NT 组/用户“域\域用户”的信息,错误代码 0x5。[SQLSTATE 42000](错误 15404)) .
我相信最后一个错误是因为 SQL Server 在本地帐户上运行,因此无法查看域帐户具有哪些权限。
使作业运行的正确方法是什么?情况 2 对我来说感觉更清晰,但似乎不可能,因为 SQL Server 在本地帐户上运行。情况 1 也可以使用,但不会在我的 SQL Server 上授予域用户管理权限。
更新:
@JonSeigel 和 @Mr.Brownstone: …
出于报告目的,我需要能够在列级别(通过sys.sql_expression_dependencies
)查询视图和基础表之间的依赖关系。
让 SQL Server 存储引用列的一种方法是使用架构绑定视图。由于我的一些用户也会创建视图,我想强制执行这些。据我所知,不可能只允许在 SQL Server 数据库中创建具有模式绑定的视图(尽管这对我来说似乎是合法的要求)。
是否有其他方法可以强制 SQL Server 跟踪哪些列被哪些视图引用?或者是否有一种隐藏的方法可以在 SQL Server 中强制执行架构绑定视图?