我有以下脚本,该脚本在循环的第二次迭代中保持不变。
BEGIN
BEGIN TRY
BEGIN TRANSACTION
DECLARE @itemID int
DECLARE LoopCursor CURSOR FOR
SELECT DISTINCT i.ItemID
FROM Inventory i
INNER JOIN Items it ON i.ItemID = it.ItemID
WHERE i.ItemID IN (226, 231, 232, 233, 234, 235, 245, 247 ,249 ,250 ,253 ,254 ,255 ,257 ,258 ,268 ,270 ,271 ,273 ,286 ,287 ,291 ,293 ,299 ,303 ,304,
305, 306, 307, 308, 310, 311, 312, 313, 314, 316, 322, 323, 324, 331, 332, 333, 334, 335, 338, 339, 340, 341, 342, 343, …Run Code Online (Sandbox Code Playgroud) 所以我们服务器上数据库的默认位置是
c:\program files\microsoft sql server\mssql11.mssqlserver\mssql\DATA
Run Code Online (Sandbox Code Playgroud)
但由于空间限制,我们改为使用
d:\data
Run Code Online (Sandbox Code Playgroud)
我现在已将默认位置更正为d:\data
但是,我无法将在错误位置创建的数据库移动c:\...\data到d:\data
试
ALTER DATABASE MYDATABASE set offline
ALTER DATABASE MYDATABASE
MODIFY FILE ( NAME = 'MYDATABASE', FILENAME = 'D:\Data\MYDATABASE.MDF')
ALTER DATABASE MYDATABASE
MODIFY FILE ( NAME = 'MYDATABASE_LOG', FILENAME = 'D:\Data\MYDATABASE_LOG.LDF')
ALTER DATABASE MYDATABASE SET ONLINE
Run Code Online (Sandbox Code Playgroud)
失败并显示以下错误消息
消息 5120,级别 16,状态 101,第 1 行
无法打开物理文件“D:\Data\MYDATABASE.MDF”。操作系统错误2:“2(系统找不到指定的文件。)”。文件激活失败。物理文件名“D:\Data\MYDATABASE_log.lDF”可能不正确。消息 5181,级别 16,状态 5,第 1 行
无法重新启动数据库“MYDATABASE”。恢复到之前的状态。消息 5069,级别 16,状态 1,第 1 行
ALTER DATABASE 语句失败。
服务器肯定可以访问新位置,因为所有其他数据库都d:\data工作正常
使用 SQL Server SQL Profiler,可以使用哪些配置来监视单个存储过程?我想捕获所有EXEC sprocName以包含参数列表。我想捕获这个过程,以便我可以使用真实的参数数据对其进行负载测试。
我在新的 SQL Profiler 跟踪中尝试了以下操作:
Events Selection > Column Filters > Text Data > LIKE: 'exec sprocName%'
Events Selection > Column Filters > Text Data > LIKE: 'exec sprocName'
Run Code Online (Sandbox Code Playgroud)
上述配置均未捕获我的程序。我还尝试使用以下配置删除过程名称:
Events Selection > Column Filters > Text Data > LIKE: 'exec%'
Events Selection > Column Filters > Text Data > LIKE: 'exec'
Run Code Online (Sandbox Code Playgroud)
以上配置不捕获任何程序。
最后,我尝试在没有任何列过滤器的情况下执行相同的配置文件,我可以确认它捕获了发送到 SQL Server 的所有 SQL 查询。
我已经考虑了一种解决方法,即使用 SQL 查询或 Excel Power Query 捕获所有存储过程执行和后过滤到我感兴趣的 sproc。但是,在我想要建模的环境中执行 sproc 的频率很高,这使得这不可行。
我工作的公司允许他们的客户拥有多个帐户。帐户也可能是负数。因此,他们的客户余额表如下所示:
????????????????????????????????????
? Customer No. ? Account ? Balance ?
????????????????????????????????????
? 1 ? A ? 1.00 ?
????????????????????????????????????
? 1 ? B ? -2.00 ?
????????????????????????????????????
? 1 ? C ? 3.00 ?
????????????????????????????????????
? 2 ? A ? 4.00 ?
????????????????????????????????????
? 2 ? B ? -5.00 ?
????????????????????????????????????
? 2 ? C ? -6.00 ?
????????????????????????????????????
? 3 ? A ? 7.00 ?
????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)
我正在尝试获取余额列的总和,不包括总余额为负的任何客户。因此,上表的结果应为 9.00 -- 客户 1 和 3 的总余额为正,因此包括所有帐户,但客户 2 的总余额为负,因此不包括任何帐户。
(注意:这是一年一次的查询,因此性能不是真正的问题。)
我想就我们目前在我工作的公司进行的索引维护获得一些意见。我们的生产 SQL 2012 集群之一由 4 个节点组成,每个节点上有两个实例,有多个 AG,为一些非常繁重的工作负载提供服务。这些 AG 中的一些数据库是 2TB+。
我们有一个标准的日常索引维护例程,它根据碎片级别进行通常的重建与重组,但我们也只对超过特定大小的索引进行重组,因为如果这些较大的索引要被删除,我们已经看到 SYNC 延迟问题重建。一旦执行了索引维护,我们就会更新统计信息等。
这项工作有时会运行长达 12 小时以上,因此它会影响我们看到流量高峰的关键工作时间,因此我们确实需要采取一些措施来缓解这种情况。
我最近看到了很多评论,有人建议根本不需要维护索引,我怀疑这可能是我们正在对只有 5% 的大型索引进行重组的情况支离破碎。
我想我想要一些关于如何识别索引的想法,这些索引不一定需要我们每天进行的维护级别,除了禁用它并观察影响(如果有的话)。
sql-server fragmentation sql-server-2012 availability-groups index-maintenance
我对使用标量 UDF 的列有一个检查约束。我有一个需要对 UDF 进行更改的要求。根据我所知,我需要删除约束,对 UDF 进行更改,然后重新添加约束。在删除约束期间,我担心可能会向表中插入坏数据。有没有办法在不放弃约束的情况下更改 UDF?如果没有,有没有办法防止坏数据进入表中?
我正在尝试查找是否有任何方法可以限制在 SQL Server 实例上加载 .bak 文件。
例子:
创建了名为“Zack”的用户,并且是名为“AdventureWorks”的数据库的 dba,他每天备份数据库并将其存储在文件夹中。
用户“Mike”可以访问 .bak 文件之一,并在本地加载整个数据库及其数据。
我们如何限制这一点并只允许授权用户恢复 SQL Sserver 中的 .bak 文件。
尝试查看 Microsoft 的多个文档,但找不到有关此用例的任何资源。当我遇到障碍时,你的见解将会非常有帮助。
SQL Server 使用 34 GB RAM。但当查询内存消耗报告、缓冲池大小和即席查询大小时,加起来只有 2 GB 左右。另外 32 GB RAM 有何用途?
\n先发制人:“您应该限制 SQL Server 可以使用的 RAM 量。” 可以说它的上限是x。这只是将我的问题改为“其他xGB 的 RAM 在做什么?”
我有一个消耗 32 GB RAM 的 SQL Server 实例:
\n\n这不是 32 GB虚拟内存;它实际上消耗了 32 GB物理内存(在 RAM 芯片上)——称为“工作集”。
\n而且它不像是与其他进程共享的。本质上所有这些都是 SQL Sever 私有的:
\n\n它用那么多内存做什么?
\n因此,我们按数据库查询内存使用情况 - …
我正在运行 SQL Server 2012(我知道,古老的......)并试图找出为什么用户没有执行某些过程的权限。
我以 登录sa,以防万一我自己的 id 没有足够的权限来冒充。
当我尝试时:
EXECUTE AS LOGIN = 'MBA\SAHFOS_GRP'
Run Code Online (Sandbox Code Playgroud)
我收到消息:
Cannot execute as the server principal because the principal "MBA\SAHFOS_GRP" does not exist, this type of principal cannot be impersonated, or you do not have permission.
Run Code Online (Sandbox Code Playgroud)
据我所知,它满足要求:
select * from sys.server_principals where name = 'MBA\SAHFOS_GRP'
name principal_id sid type type_desc is_disabled create_date modify_date default_database_name default_language_name credential_id owning_principal_id is_fixed_role
MBA\SAHFOS_GRP 413 0x0105000000000005150000007CEB240DCD7C4166235F636BC8040000 G WINDOWS_GROUP 0 2017-12-01 10:00:45.050 2017-12-01 10:00:45.057 cpr_prod us_english NULL NULL 0 …Run Code Online (Sandbox Code Playgroud) 我们处于这样的情况:选择被更新阻止。但表格不同。
UPDATE [dbo].[TABLE_1]
SET ...
SELECT [t1].[field]
FROM [dbo].[TABLE_1] AS [t1]
WHERE...
Run Code Online (Sandbox Code Playgroud)
当它们同时运行时,这个简单的过程会阻塞这个过程:
SELECT "A lot of fields"
FROM TABLE_TOTALLY_DIFFERENT
INNER JOIN [another table totally different]
ON...
WHERE...
Run Code Online (Sandbox Code Playgroud)
这对我来说毫无意义。
即使通过查看 pageID,我也可以看到在这种情况下被锁定的表是TABLE_TOTALLY_DIFFERENT.
但他们与他们无关。
我如何查找并确定它们被锁定的原因?
sql-server-2012 ×10
sql-server ×7
buffer-pool ×1
cursors ×1
functions ×1
locking ×1
profiler ×1