是否有 T-SQL 查询显示某个数据库的上次还原日期时间?
我想知道如何识别实际填充 TEMPDB 数据库事务日志的确切查询或存储过程。
sql-server-2005 sql-server-2008 sql-server tempdb transaction-log
我正在尝试强制删除数据库,但是在删除数据库后,当我尝试重新创建数据库时,出现错误
无法创建文件 C:\Program Files.....[databasename].mdf 因为它已经存在
这是我强制删除数据库的查询
Use master;
ALTER database [databasename] set offline with ROLLBACK IMMEDIATE;
DROP database [databasename];
Run Code Online (Sandbox Code Playgroud)
我明白,上面的查询正在删除数据库,但它没有删除.ldf
和.mdf
文件。如何彻底删除数据库?
正常查询
Drop database [databasename] ; //deletes the database completely, including the ldf and mdf's.
Run Code Online (Sandbox Code Playgroud)
如何强制删除数据库,同时删除.mdf
和.ldf
文件?
我正在为一个简单的银行数据库编写架构。以下是基本规格:
银行应用程序将专门通过存储过程与其数据库通信。
我希望这个数据库每天接受数十万个新事务,以及更高数量级的平衡查询。为了非常快速地提供余额,我需要预先汇总它们。同时,我需要保证余额永远不会与其交易历史相矛盾。
我的选择是:
有一个单独的balances
表并执行以下操作之一:
将事务应用于transactions
和balances
表。TRANSACTION
在我的存储过程层使用逻辑来确保余额和交易始终同步。(由杰克支持。)
将交易应用到transactions
表并有一个触发器,balances
用交易金额为我更新表。
将交易应用到balances
表中,并有一个触发器transactions
为我在表中添加一个新条目,其中包含交易金额。
我必须依靠基于安全的方法来确保在存储过程之外不能进行任何更改。否则,例如,某些进程可以直接将事务插入transactions
表中,并且在该方案1.3
下相关余额将不同步。
有一个balances
索引视图,可以适当地聚合事务。存储引擎保证余额与其交易保持同步,因此我不需要依赖基于安全的方法来保证这一点。另一方面,我不能再强制余额为非负数,因为视图——甚至索引视图——不能有CHECK
约束。(由丹尼支持。)
只有一个transactions
表,但有一个额外的列来存储该交易执行后立即生效的余额。因此,用户和货币的最新交易记录也包含其当前余额。(下面由Andrew建议;由garik提出的变体。)
当我第一次解决这个问题时,我阅读了这 两个讨论并决定了 option 2
。作为参考,您可以在此处查看它的基本实现。
您是否设计或管理过这样的具有高负载配置文件的数据库?你对这个问题的解决方案是什么?
你认为我做出了正确的设计选择吗?有什么我应该记住的吗?
例如,我知道对transactions
表的架构更改需要我重建balances
视图。即使我正在归档事务以保持数据库较小(例如,将它们移到其他地方并用摘要事务替换它们),每次架构更新时都必须重建数千万个事务的视图,这可能意味着每次部署的停机时间会显着增加。
如果索引视图是要走的路,我如何保证没有余额为负?
归档交易:
让我详细说明一下存档交易和我上面提到的“摘要交易”。首先,在像这样的高负载系统中,定期存档将是必要的。我想保持余额与其交易历史之间的一致性,同时允许将旧交易转移到其他地方。为此,我将用每个用户和货币的金额摘要替换每批存档交易。
因此,例如,此交易列表:
user_id currency_id amount is_summary
------------------------------------------------
3 1 10.60 …
Run Code Online (Sandbox Code Playgroud) sql-server-2008 database-design sql-server aggregate materialized-view
我有一个进程可以抓取一堆记录(1000 条)并对它们进行操作,当我完成后,我需要将其中的大量记录标记为已处理。我可以用一个大的 ID 列表来表明这一点。我试图避免“循环更新”模式,所以我想找到一种更有效的方法来将这个 ID 包发送到 MS SQL Server 2008 存储过程中。
提案#1 - 表值参数。我可以定义一个只有一个 ID 字段的表类型,然后发送一个包含要更新的 ID 的表。
建议 #2 - XML 参数 (varchar) 和 OPENXML() 在 proc 主体中。
建议 #3 - 列表解析。如果可能的话,我宁愿避免这种情况,因为它看起来笨拙且容易出错。
其中有什么偏好,或者我错过了什么想法?
最近我们的一个 ASP.NET 应用程序显示了一个数据库死锁错误,我被要求检查并修复该错误。我设法找到死锁的原因是一个存储过程,它严格更新游标内的表。
这是我第一次看到这个错误,不知道如何有效地跟踪和修复它。我尝试了我知道的所有可能的方法,最后发现正在更新的表没有主键!幸运的是,这是一个身份栏。
后来我发现为部署编写数据库脚本的开发人员搞砸了。我添加了一个主键,问题就解决了。
我感到很高兴并回到我的项目中,并做了一些研究以找出导致僵局的原因......
显然,这是导致死锁的循环等待条件。没有主键的更新显然比有主键需要更长的时间。
我知道这不是一个明确定义的结论,这就是我在这里发布的原因......
今天在对服务代理问题进行故障排除时,我发现数据库所有者是离开公司的员工的 Windows 登录名。他的登录名已被删除,因此查询通知失败。
据说处理这个问题的最佳实践是让“sa”成为数据库所有者。我们更改了它并清除了队列。
我的(非常基本的)问题:数据库所有者是什么,其目的是什么?
我已经设置了一台运行 Windows Server 2008 的服务器,并安装了 SQL Server 2008 Express。
我可以通过以下方式连接到机器的 SQL Server Express 数据库 MACHINENAME/SQLEXPRESS
.
但是,当我们使用IP 地址通过任何软件或脚本进行连接时连接时,它将不允许连接。
我试过了:
当我们尝试通过软件“SQL Server Management Studio”进行连接时,我们收到以下消息:
错误信息:
与服务器建立连接时发生错误。连接到 SQL Server 2005 时,此失败可能是由于 SQL Server 在默认设置下不允许远程连接造成的。(提供者:TCP 提供者,错误:0 - 由于目标机器主动拒绝,无法建立连接。)(Microsoft SQL Server,错误:10061)
已成功与服务器建立连接,但随后在登录过程中出现错误。(提供程序:TCP 提供程序,错误:0 - 已建立的连接被主机中的软件中止。)(Microsoft SQL Server,错误:10053)
你能告诉我你什么时候有空吗,这样我们就可以看看,因为我似乎知道在哪里,我已经根据 UK Fast 发给我的一些信息修改了细节,但他们说“这不在支持范围内” ,所以他们无能为力。
我期待着您的回音。
我错误地从远程 SQL Server 2008 表中删除了大约 2,000,000 条记录。服务器未授予我访问服务器端备份文件的权限。
有什么办法可以找回这些记录吗?
在 SQL Server(在本例中为 2008)中,如何快速缩小实例上所有数据库的所有文件,包括日志和数据?我可以通过 SSMS 并右键单击每个并选择任务 -> 收缩,但我正在寻找更快的东西。
我编写了一些“创建数据库”脚本,但忘记了它们的默认值已经膨胀,并且不需要为该项目中的这些文件保留太多空间。
sql-server ×10
sql-server-2008 ×10
aggregate ×1
deadlock ×1
permissions ×1
recovery ×1
restore ×1
shrink ×1
tempdb ×1