我们的 OLTP 日志系统的其中一个表中的 ID 即将用完。我的工作是找到一种方法来“归档”完整表和所有引用表中的现有行数据,以便我们可以继续将新数据记录到表中。
我们在一个表中归档数据的最快方法是简单地重命名目标表和所有依赖对象——联结表、索引、约束。它速度很快,并且可以保持数据完整。为了完成这项工作,我们必须使用旧名称创建所有对象的新的空副本。如果我们在一个事务中完成所有这些操作,插入新数据的存储过程不会因为缺少表而失败。
我已经整理了一个 PowerShell 脚本来生成一个 T-SQL 脚本来执行存档操作。
该脚本没有生成应有的重命名语句,我不明白为什么。
该脚本加载 SMO,设置目标对象的名称,并设置到服务器的仅捕获连接 - 这样我就可以捕获重命名命令以供稍后检查:
Add-Type -AssemblyName "Microsoft.SqlServer.Smo, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91";
$ServerName = 'CLOUDCORP\LOGGING'
$DatabaseName = 'Logging'
$TableName = 'tbDataRequests'
$TableSchemaName = 'Logging'
$Server = New-Object Microsoft.SqlServer.Management.Smo.Server $ServerName
$Server.ConnectionContext.SqlExecutionModes = [Microsoft.SqlServer.Management.Common.SqlExecutionModes]::CaptureSql
Run Code Online (Sandbox Code Playgroud)
接下来,它创建一个将通过重命名存档的对象数组。目标表本身、所有引用表以及这些表的所有键和所有索引都将被归档:
$Database = $Server.Databases[$DatabaseName]
$Table = @($Database.Tables[$TableName, $TableSchemaName])
$ReferencingTables = $Database.Tables.ForeignKeys |
? { $_.ReferencedTable -eq $TableName -and $_.ReferencedTableSchema -eq $TableSchemaName } |
% { $_.Parent } | Sort ID | Get-Unique
$TablesToArchive = …Run Code Online (Sandbox Code Playgroud) 我使用 SQL Server Mangagement Studio 来检查我的数据库中对象的定义。
例如,要检查 master 数据库中表 dbo.MSreplication_options 的定义,我将在对象资源管理器中右键单击该表并选择“脚本表为...> CREATE to > New Query Editor Window... '。

从我的 Management Studio 当前状态的屏幕截图中可以看出,为名为“SQLQuery9.sql”的新脚本创建了一个新选项卡,其中包含表定义。
到目前为止,我已经以这种方式检查了一些其他对象,并且忘记了大多数其他称为“SQLQuery1.sql”、“SQLQuery2.sql”等的脚本所包含的内容。
如何配置 management studio 给脚本一个更具描述性的名称,可能包含对象的名称,例如“dbo.MSreplication_options.sql”。
我的 Management Studio 版本是 10.0.5500.0。
我试图找到一个可靠、有效的表达式来计算写一个正整数需要多少个十进制数字。
在数学上,整数中的十进制位数n是1 + floor(log(n)),其中 log 是常用对数(以 10 为底)。
有多种使用内置函数构造等效表达式的方法,但其中一些会给出错误的结果。有人可以解释为什么吗?
这是一个例子。
计算常用对数的最简单方法是使用LOG10函数。
如果您希望所有对数都使用一个函数,则可以使用该LOG函数并使用第二个参数指定以 10 为底的函数。
在 2012 年之前,SQL Server 的LOG函数将仅计算自然对数(基数 e=2.71828...)。您可以通过将数字的自然对数除以数字的自然对数来计算对数到数字的任意底数。
以下查询为一些示例值计算所有三个表达式:
SELECT
Number,
LOG(Number, 10) AS LogAB,
LOG10(Number) AS LogTen,
LOG(Number) / LOG(10) AS LogOverLog
FROM (
VALUES (999), (1000), (1001)
) AS Tally (Number);
Run Code Online (Sandbox Code Playgroud)
输出:
Number LogAB LogTen LogOverLog
----------- ---------------------- ---------------------- ----------------------
999 2.99956548822598 2.99956548822598 2.99956548822598
1000 3 3 3
1001 3.00043407747932 3.00043407747932 3.00043407747932
Run Code Online (Sandbox Code Playgroud)
我选择了值 999、1000 和 …
我必须找到一个非常糟糕的例子,因为缺少函数依赖,你不能应用希思定理。
但是我是对的,每个关系都至少有一个函数依赖吗?
或者你们中的任何人都可以想出一个示例表,其中至少有 3 组属性来投影它,然后将其连接在一起。结果当然应该与原始表不同,以证明希思定理是正确的(没有 FD -> 没有无损分解)
无关紧要,无论是 sql 示例还是抽象示例。
我的项目是为许多国家设计一个医学数据库。
该数据库包含许多部分:每个国家都有自己的语言的药品、医疗中心、患者等。
我从医学部分开始我的设计,但我有很多问题仍在继续:
我上传了 2 张图片,用于药物部分的初始设计,仅限英文。
注意:这两张照片只是一张,但太大了所以我把它分成了两半
我使用 SQL Server 2008。

Red Gate 部署管理器(RGDM) 今天失败并出现“登录失败”错误,即使它具有目标服务器的管理控制权:
2013-11-04 17:13:22 +00:00 INFO Creating [dbo].[GetPublications]
2013-11-04 17:41:29 +00:00 INFO Command RedGate.Deploy.Agent.Commands.SingleShotDeploymentCommand failed
2013-11-04 17:41:29 +00:00 INFO RedGate.Deploy.PluginApi.Deployment.ConventionFailedException: Dynamic deployment failed
2013-11-04 17:41:29 +00:00 INFO Login failed for user 'red_gate_deployment_manager'. ---> RedGate.Deploy.SqlServerDbPackage.Shared.Exceptions.SqlServerInaccessibleException: Dynamic deployment failed
2013-11-04 17:41:29 +00:00 INFO Login failed for user 'red_gate_deployment_manager'. ---> System.Data.SqlClient.SqlException: Login failed for user 'red_gate_deployment_manager'.
Run Code Online (Sandbox Code Playgroud)
我要部署的过程之一是指链接服务器上的分发数据库。定义如下所示:
CREATE PROCEDURE dbo.GetPublications
AS
BEGIN
SELECT publisher_db, publication, description
FROM DISTRIBUTOR.distribution.dbo.MSpublications;
END;
Run Code Online (Sandbox Code Playgroud)
在 SSMS 中,我以 red_gate_deployment_manager 的身份连接到目标服务器并尝试手动创建该过程。我收到了类似的错误:
Msg 18456, Level 14, State 1, …Run Code Online (Sandbox Code Playgroud)