AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / user-1514

db2's questions

Martin Hope
db2
Asked: 2019-02-12 06:22:05 +0800 CST

使具有多个实例的服务器成为两个有效独立集群的成员

  • 2

我们正处于为我们的 ERP 和 CRM 应用程序(第三方)规划新数据库环境的早期阶段。目标是将 Always On 可用性组用于 HA、滚动补丁、只读辅助等。我们希望使用自动故障转移,而客户端应用程序不需要知道 HA。

我们有一台规格相当大的物理服务器。它将运行两个 SQL Server 实例:一个用于需要 SQL Server 2016 的 ERP 应用程序,另一个用于 2017 年更适合的 CRM 应用程序(这也允许我们授予系统管理员权限以获取 CRM 应用程序供应商的支持不影响 ERP 应用程序)。

我们还有一个相当成熟的 ESX 基础架构,并希望使用一些 VM 作为故障转移节点。这些不会像主服务器那样过时地构建,但我们将确保主服务器上的短时间中断或维护窗口具有可接受的性能。

我最初的想法是拥有两台故障转移虚拟机:一台用于 ERP 实例,一台用于 CRM。单个服务器似乎不能成为多个 Windows 故障转移集群的成员,即我无法使用 ERP VM 和物理服务器创建 ERP 集群,再加上具有 CRM VM 和同一物理服务器的 CRM 集群.

如果我改为构建一个三节点集群,并控制每个实例可以在哪些节点上运行,我是否会引起任何不愉快的副作用?我主要担心的是,如果我们开始向集群中添加更多的数据库服务器,仲裁投票可能会变得有点奇怪,并且即使可以托管该实例的所有节点仍在运行,我们也可能让一个实例意外停机。这甚至是一种风险,是否有合理的方法来减轻它?是否存在足够多的并发症,以至于我应该使用一个更强大的 VM 来处理这两个实例?

长话短说:

如果构建一个实例 1 只能在服务器 A 和 B 上运行,而实例 2 只能在服务器 A 和 C 上运行的三节点集群,我会搬起石头砸自己的脚吗?我应该只构建一个双节点集群(加上仲裁成员)并确保服务器 B 可以处理两个 SQL Server 实例吗?

sql-server clustering
  • 2 个回答
  • 602 Views
Martin Hope
db2
Asked: 2018-11-09 08:08:55 +0800 CST

通过指向一个或多个包含备份文件的目录并指定 STOPAT 时间来恢复数据库 [重复]

  • 1
这个问题在这里已经有了答案:
从网络共享自动化数据库还原 (1 个答案)
3 年前关闭。

我正在准备/测试我们的 ERP 和其他辅助系统到新数据库服务器的迁移。这将涉及将数据库备份从旧服务器恢复到新服务器上。

为了方便起见,我希望能够使用脚本/存储过程来恢复数据库,只需指向一个或多个包含备份文件(完整、差异和日志的组合)的目录,并可选择指定一个 STOPAT 时间,或者忽略它并在存在备份的情况下恢复到最近的可能时间。我还需要能够明确指定新文件位置(MOVE 选项),或者更一般地“将所有数据文件放在这里,并将所有日志文件放在这里”。该工具应查看所提供目录中的所有文件,并确定需要恢复哪些文件才能达到目标时间。

Management Studio 中的 GUI 恢复工具可以完成所有这些,但显然不能包含在脚本中。我希望能够编写一个在概念上与此类似的通用迁移脚本:

EXEC master..RestoreDB
    @database='ERPSysDB',
    @source='\\oldserver\Backup\oldserver\ERPSysDB\FULL,\\oldserver\Backup\oldserver\ERPSysDB\DIFF,\\oldserver\Backup\oldserver\ERPSysDB\LOG',
    @datadir='D:\SQLServer\DATA',
    @logdir='L:\SQLServer\DATA';

--Do various cleanup/post processing steps in ERPSysDB here

EXEC master..RestoreDB
    @database='ERPCompanyDB',
    @source='\\oldserver\Backup\oldserver\ERPCompanyDB\FULL,\\oldserver\Backup\oldserver\ERPCompanyDB\DIFF,\\oldserver\Backup\oldserver\ERPCompanyDB\LOG',
    @datadir='D:\SQLServer\DATA',
    @logdir='L:\SQLServer\DATA';

--More post-processing in ERPCompanyDB here

--Now restore a test copy of the database that we don't back up directly on the production server,
--using production database backups instead:
EXEC master..RestoreDB
    @database='ERPCompanyDB',
    @restoreas='ERPCompanyTestDB',
    @source='\\oldserver\Backup\oldserver\ERPCompanyDB\FULL,\\oldserver\Backup\oldserver\ERPCompanyDB\DIFF,\\oldserver\Backup\oldserver\ERPCompanyDB\LOG',
    @stopat='2018-11-01T08:00:00'
    @with='MOVE ''ERPDataFile'' TO ''D:\SQLServer\DATA\ERPCompanyTestDB.mdf'', MOVE ''ERPLogFile'' TO ''L:\SQLServer\DATA\ERPCompanyTestDB.ldf''';

--Additional post-processing, database restores, etc...

是否有提供此功能的现有工具?我准备自己编写,但那将是相当复杂的代码块(尤其是错误/异常处理),所以我不想重新发明轮子。我更希望它可以在 T-SQL 中使用,即不是 PowerShell cmdlet,但是 CLR 存储过程会很好(并且很可能是实现它的更简单/更好的方法)。

sql-server backup
  • 2 个回答
  • 127 Views
Martin Hope
db2
Asked: 2016-01-21 06:28:43 +0800 CST

ORDER BY 和比较混合的字母和数字字符串

  • 10

我们需要对通常是需要“自然”排序的数字和字母混合字符串的值进行一些报告。诸如“P7B18”或“P12B3”之类的东西。@字符串主要是字母序列,然后是数字交替。不过,这些片段的数量和每个片段的长度可能会有所不同。

我们希望这些数字部分按数字顺序排序。显然,如果我直接用 处理这些字符串值ORDER BY,那么“P12B3”将出现在“P7B18”之前,因为“P1”早于“P7”,但我希望反过来,因为“P7”自然在前面“P12”。

我还希望能够进行范围比较,例如@bin < 'P13S6'或类似的。我不必处理浮点数或负数;这些严格来说是我们正在处理的非负整数。字符串长度和段数可能是任意的,没有固定的上限。

在我们的例子中,字符串大小写并不重要,尽管如果有一种方法可以以一种可识别的方式执行此操作,其他人可能会发现这很有用。所有这一切中最丑陋的部分是我希望能够在WHERE子句中进行排序和范围过滤。

如果我在 C# 中执行此操作,这将是一项非常简单的任务:进行一些解析以将 alpha 与数字分开,实现 IComparable,然后您就基本上完成了。当然,SQL Server 似乎没有提供任何类似的功能,至少据我所知。

任何人都知道使这项工作的任何好技巧?是否有一些鲜为人知的能力来创建实现 IComparable 并使其行为符合预期的自定义 CLR 类型?我也不反对 Stupid XML Tricks(另请参见:列表连接),并且我在服务器上也提供了 CLR 正则表达式匹配/提取/替换包装函数。

编辑: 作为一个更详细的例子,我希望数据表现得像这样。

SELECT bin FROM bins ORDER BY bin

bin
--------------------
M7R16L
P8RF6JJ
P16B5
PR7S19
PR7S19L
S2F3
S12F0

即将字符串分解为所有字母或所有数字的标记,并分别按字母或数字对它们进行排序,最左边的标记是最重要的排序项。就像我提到的,如果您实现 IComparable,在 .NET 中小菜一碟,但我不知道您如何(或是否)可以在 SQL Server 中执行此类操作。这肯定不是我在 10 年左右的工作中遇到过的事情。

sql-server sql-server-2012
  • 1 个回答
  • 8361 Views
Martin Hope
db2
Asked: 2015-07-21 06:49:44 +0800 CST

需要了解 FileTable 权限

  • 0

我正在设置一个 FileTable 以允许用户将一些 PDF 报告文件快速填充到数据库中,以便以后通过 Intranet 应用程序(稍后构建)进行搜索。整理出必要的权限有点挑战,我遇到了一些障碍。

首先,我已经确认我(具有系统管理员权限)可以毫无问题地向共享添加和删除文件,因此 FileTable 至少可以正常工作。

我已将最终用户添加到 AD 组,在 SQL Server 中为该组创建了 Windows 登录,将其映射到数据库用户,并授予该用户对 FileTable 的选择、插入、更新和删除权限。用户已注销他的计算机并再次登录以确保我将他添加到的组在身份验证令牌中。

他可以访问实例的基本文件流共享 ( \\servername\FileStream),但是当他尝试更深入地访问特定于数据库的目录 ( \\servername\FileStream\DatabaseFileStreamDirectoryName) 时,他会收到权限错误(“您没有访问权限...”)。如果他尝试直接访问 FileTable 路径 ( \\servername\FileStream\DatabaseFileStreamDirectoryName\PDFReports),也是如此。

那么,授予访问权限的正确方法是什么,以便用户可以浏览到特定数据库的共享子目录,查看其中的 FileTables 目录,并最终浏览/访问 FileTables 中的文件?它显然不仅仅是数据库中的用户映射,以及对表的选择/插入/更新/删除权限,到目前为止,我还没有找到很多明确的文档。

这是我用来设置的(稍微匿名的)代码:

USE master
GO
ALTER DATABASE AppData ADD FILEGROUP FS CONTAINS FILESTREAM
ALTER DATABASE AppData ADD FILE ( NAME = N'FS', FILENAME = N'S:\Filestream\AppData\FS' ) TO FILEGROUP [FS]
ALTER DATABASE AppData SET SINGLE_USER WITH ROLLBACK IMMEDIATE
ALTER DATABASE AppData SET FILESTREAM( DIRECTORY_NAME = N'AppData' ) WITH NO_WAIT
ALTER DATABASE AppData SET MULTI_USER
GO
USE AppData
GO
CREATE TABLE PDFReports AS FileTable WITH (FileTable_Directory = 'PDFReports')

GRANT SELECT, INSERT, UPDATE, DELETE ON PDFReports TO [MyDomain\App Operators]
sql-server sql-server-2012
  • 1 个回答
  • 2971 Views
Martin Hope
db2
Asked: 2013-12-11 06:58:37 +0800 CST

为通过 sp_executesql 调用的查询创建计划指南

  • 5

长话短说,我有一个名为 vwRelatives 的视图,它使用 CTE 递归来构建家谱。它意味着一次查询一个人。

这大约在四分之一秒内运行:

SELECT * FROM vwRelatives WHERE person_id = 5

这(从应用程序执行查询的方式)大约需要 4.5 秒:

exec sp_executesql N'SELECT * FROM vwRelatives WHERE person_id = @P1',N'@P1 int',5

(请注意,我已经稍微简化了查询。真实的东西有一个明确的列列表和一个ORDER BY,但WHERE语义是相同的。我在任何一个版本中都得到相同的症状。)

person_id = 5最有可能的是,SQL Server在为第一个查询创建执行计划时能够考虑到,但是参数化它会导致整个视图运行,然后按 person_id 过滤。

所以我想我会创建一个计划指南。现在我有两个问题。

这些是我正在采取的步骤,似乎没有效果。

首先,运行“好”查询以将其放入计划缓存中...

SELECT * FROM vwRelatives WHERE person_id = 5

...然后执行标准步骤将其变成计划指南...

--Get the 'good' plan
SET @xml_showplan = (
    SELECT query_plan
    FROM sys.dm_exec_query_stats AS qs 
        CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st
        CROSS APPLY sys.dm_exec_text_query_plan(qs.plan_handle, DEFAULT, DEFAULT) AS qp
        WHERE st.text LIKE N'SELECT * FROM vwRelatives WHERE person_id = 5'
)

--Apply a plan guide to the meat of the sp_executesql query
EXEC sp_create_plan_guide 
    @name = N'vwRelatives_Test_Plan_Guide', 
    @stmt = N'SELECT * FROM vwRelatives WHERE person_id = @P1', 
    @type = N'SQL',
    @module_or_batch = NULL, 
    @params = N'@P1 int', 
    @hints = @xml_showplan;

这成功完成,但是当我再次运行原来的 sp_executesql 语句时,仍然需要 4.5 秒。我正在运行 Profiler,并且选择了“计划指南成功”和“计划指南不成功”事件。这些事件都没有出现在跟踪中。

我做错了什么导致 SQL Server 无法将此计划指南视为 sp_executesql 查询的匹配项?

sql-server sql-server-2012
  • 1 个回答
  • 1478 Views
Martin Hope
db2
Asked: 2013-07-03 12:00:05 +0800 CST

对超大表进行分区/索引

  • 7

我正在对大约 500 GB 的单个数据仓库表进行索引和分区。该表是一个堆,有一百多TEXT列,并且该TEXT_IN_ROW选项已启用。这张桌子不是我设计的,我也没有能力在不久的将来改变它。

我的任务是对它进行分区。我们正在使用测试服务器上的数据库副本来解决这个问题。它可以每秒向 SSD RAID 阵列推送大约 2 GB 的数据,因此 I/O 不是一个重大瓶颈,它有 16 个内核(2 个 NUMA 节点)和 64 GB 的 RAM。

我的方法是禁用所有非聚集索引,创建分区函数和分区方案(大约 12 个分区,全部在PRIMARY文件组上 - 他们使用它来启用滚动维护并为夜间 ETL 提供更多本地化插入,而不是分发我/O),然后使用此分区方案为表构建聚集索引。

我正在创建聚集索引并对表进行分区,如下所示:

CREATE CLUSTERED INDEX CX_DailyTable ON DailyTable (LoadDate, SeqNumber) 
  WITH (SORT_IN_TEMPDB = ON) ON monthly_on_primary (LoadDate)

显然,这需要很长时间(到目前为止,这篇文章需要 3 个小时),而且我当然不希望它很快。让我稍微担心的是 tempdb 现在正在推动近 1 TB 并稳步攀升,尽管当前表的大小约为该大小的一半。我读过的 MS 文档建议 tempdb 空间使用量应该大约是最终表/聚集索引的大小。

http://msdn.microsoft.com/en-us/library/ms188281.aspx

如果 SORT_IN_TEMPDB 设置为 ON,则 tempdb 中必须有足够的可用空间来存储排序运行,并且目标文件组中必须有足够的可用空间来存储最终的索引结构。排序运行包含索引的叶行。

他们的估计不正确吗?tempdb 的用途不仅仅是排序运行吗?或者创建这个聚集索引以某种方式使表的大小增加了一倍?(似乎不太可能;这是一个相当宽的表,我估计我们每行会获得额外的 4-8 个字节,加上通过添加聚集索引的非叶页。)

sql-server sql-server-2008-r2
  • 1 个回答
  • 4334 Views
Martin Hope
db2
Asked: 2013-01-25 05:05:38 +0800 CST

为现有 AlwaysOn 数据库启用 TDE

  • 6

无论是否启用 TDE,我都需要对 AlwaysOn 进行一些基准测试。我看到的所有说明都包括将加密数据库添加到可用性组,但我没有看到为已经在 AG 中的数据库启用加密。

我可以将服务器证书恢复到所有节点,然后从主节点启用 TDE 吗?我希望我不需要从 AG 中删除数据库,对其进行加密,然后重新初始化所有节点,因为数据库大约 100 GB。如果需要,我们可以这样做,但它肯定会减慢我们的测试速度。

更新

我刚刚在一些实验室虚拟机上试过这个。我能够在主节点上创建一个证书,在所有辅助节点上恢复它,然后使用这个证书在主节点上创建一个数据库加密密钥。之后我所要做的就是ALTER DATABASE AdventureWorks SET ENCRYPTION ON在主服务器上,一两分钟后,sys.dm_database_encryption_keys 在所有节点上显示 encryption_state = 3。

所以,后续问题:有什么理由认为我不应该使用这个程序吗?SQL Server 似乎对结果很满意,但我还没有看到任何地方讨论过这种方法。在处理加密和高可用性问题时,我不想让事情碰运气。

sql-server sql-server-2012
  • 1 个回答
  • 2194 Views
Martin Hope
db2
Asked: 2012-04-19 04:37:35 +0800 CST

在组级别而不是详细信息上求和值

  • 4

我正在为某些项目计费开发发票报告。主 tablix 有几个组,按以下顺序:

  • 项目组
  • 票务组
  • 笔记组
  • 详细信息(实际帐单详细信息)

数据最终可能看起来像这样:

project_id  ticket_id   note_id     hours        billing_agreement_id billed_hours
----------- ----------- ----------- ------------ -------------------- ------------
1           1           1           0.50         4                    0.75
1           1           2           0.50         5                    1.00
1           1           3           1.00         7                    1.00
1           1           8           5.00         7                    3.00
1           1           8           5.00         2                    2.00
2           2           4           4.00         1                    4.00
2           2           5           2.00         6                    3.00

换句话说,将工单分配给项目,在工单上输入注释(具有相应的工作小时数),然后将注释时间计入一个或多个协议/合同(如果区块时间协议用尽,例如,其余的可能会溢出到另一个协议)。就应用程序而言,这一切都很好。

所以现在我正在创建发票报告,我需要在报告末尾提供总的工作时间。看看第 4 行和第 5 行(note_id = 8)。报告页脚使用Sum(hours),然后最终将该注释计为 10 小时。两者note_id都hours来自注释行,并且应该相应地相加。包含hours在 NoteGroup 的分组表达式中自然不会影响 Sum 的行为。

是否有一种直接的方法可以让 Reporting Services 汇总小时数,只查看该组的分组值,而不是详细信息行?到目前为止,我想不出任何特别优雅的东西。如有必要,我可以退回到奇怪的自定义代码特技。

sql-server-2008 ssrs
  • 1 个回答
  • 2871 Views
Martin Hope
db2
Asked: 2012-04-12 05:16:11 +0800 CST

防止数据源被部署到指定文件夹之外

  • 7

在我继续对 Catalog 表设置一个非常糟糕的检查约束之前,我想先征求一些更好的想法。

我想确保我们报表服务器上的所有共享数据源都部署到“/Data Sources”。时不时地,我们会错误地将一个部署到其他目录(特别是如果它是从 SSRS 2000 升级的报告,它不允许指定不同的数据源部署位置)。

如果归根结底,我可以在 Catalog(Type != 5 OR ParentID = 'GUID of /Data Sources directory'或类似的)上设置一个丑陋的检查约束,但如果有更好的选择,我宁愿使用它。

sql-server sql-server-2008
  • 3 个回答
  • 937 Views
Martin Hope
db2
Asked: 2012-04-04 05:30:11 +0800 CST

Management Studio 2012 向后兼容性

  • 4

对于任何尝试过这个的人来说,两个快速的问题:

  1. Management Studio 2012 是否会与 Management Studio 2008 等同时安装和运行?我隐约记得 2008 年和 2005 年无法做到这一点。

  2. Management Studio 2012 是否完全支持连接和管理 SQL Server 2008?Intellisense 是否仍然适用于旧版本?

sql-server sql-server-2012
  • 1 个回答
  • 4307 Views
Martin Hope
db2
Asked: 2012-03-30 05:49:09 +0800 CST

在 Management Studio 中编辑内置模板

  • 3

我正在运行 SQL Server Management Studio 2008 (10.0.5500.0) 并试图编辑内置模板“创建 T-SQL 触发器(新菜单)”。我打开模板资源管理器,右键单击模板,选择编辑,修改它,然后保存。

但是当我尝试通过右键单击任何表格下方的“触发器”并选择“新建触发器”来使用模板时,它仍然使用默认模板。

在 Process Explorer 中,我可以在编辑模板时看到它正在访问此文件:

C:\Users\username\AppData\Roaming\Microsoft\Microsoft SQL Server\100\Tools\Shell\Templates\Sql\Trigger\Create T-SQL Trigger (New Menu).sql

当我尝试使用模板时,它会从此路径加载脚本:

C:\Program Files\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE\SqlWorkbenchProjectItems\Sql\Trigger\Create T-SQL Trigger (New Menu).sql

是否有特定的设置/补丁来帮助它整理文件路径?

sql-server sql-server-2008
  • 2 个回答
  • 1107 Views
Martin Hope
db2
Asked: 2012-03-29 09:49:07 +0800 CST

在触发器中加入 INSERTED 和 DELETED 表的性能很差

  • 14

我在表上有一个 UPDATE 触发器,它监视特定列从一个特定值更改为任何其他值。发生这种情况时,它会通过单个 UPDATE 语句更新另一个表中的一些相关数据。

触发器所做的第一件事是检查是否有任何更新的行使该列的值与所讨论的值不同。它只是将 INSERTED 连接到 DELETED 并比较该列中的值。如果没有任何条件,它会提前退出,因此 UPDATE 语句不会运行。

IF NOT EXISTS (
    SELECT TOP 1 i.CUSTNMBR
    FROM INSERTED i
        INNER JOIN DELETED d
            ON i.CUSTNMBR = d.CUSTNMBR
    WHERE d.CUSTCLAS = 'Misc'
        AND i.CUSTCLAS != 'Misc'
)
    RETURN

在这种情况下,CUSTNMBR 是基础表的主键。如果我对此表进行大量更新(例如,超过 5000 行),即使我没有触及 CUSTCLAS 列,此语句也会占用 AGES。我可以在 Profiler 中看到它在这个语句上停滞几分钟。

执行计划很奇怪。它显示了具有 3,714 次执行和约 1850 万输出行的插入扫描。这通过 CUSTCLAS 列上的过滤器运行。它将此(通过嵌套循环)连接到已删除扫描(也在 CUSTCLAS 上过滤),该扫描仅执行一次并具有 5000 个输出行。

我在这里做了什么愚蠢的事情来造成这种情况?请注意,触发器绝对必须正确处理多行更新。

编辑:

我也试过这样写(以防 EXISTS 做了一些不愉快的事情),但它仍然很糟糕。

DECLARE @CUSTNMBR varchar(31)
SELECT TOP 1 @CUSTNMBR = i.CUSTNMBR
FROM INSERTED i
    INNER JOIN DELETED d
        ON i.CUSTNMBR = d.CUSTNMBR
WHERE d.CUSTCLAS = 'Misc'
    AND i.CUSTCLAS != 'Misc'

IF @CUSTNMBR IS NULL
    RETURN
sql-server sql-server-2008
  • 5 个回答
  • 15421 Views
Martin Hope
db2
Asked: 2012-03-08 05:31:55 +0800 CST

处理有时会失败,并显示“出现意外的文件结尾”。

  • 2

我有一个用于报告电子邮件活动的 Analysis Services 数据库。它主要计算传入和传出的消息,它们来自和来自谁等。

事实表:11,367,910 行
地址维度表:386,015 行目标
地址事实表:21,303,290 行(用于多对多中间度量组)
日期维度表:9,132 行

这是一个简单的结构,但里面有很多数据。这两个度量值组有 6 个年度分区,其中包含不同数量的行。整个过程大约需要 30 分钟才能完全处理。

但这不是我的问题(至少我不这么认为)。看似随机的,调度的处理任务会失败,错误Unexpected end of file has occurred. The following elements are not closed: root, return, ExecuteResponse, soap:Body, soap:Envelope. Line 3707, position 1.是行号可以变化,但错误是一样的。我试过四处寻找,但我找不到任何关于这表明什么的信息。还有其他人遇到这个错误吗?

sql-server-2008 ssas
  • 1 个回答
  • 2080 Views
Martin Hope
db2
Asked: 2012-03-03 05:36:37 +0800 CST

ParallelPeriod 在日期维度中为 2 月 29 日返回 null

  • 3

我有一个由物理日期表支持的日历日期维度(最初是在 SQL Server 2000 上创建的,因此是日期时间而不是日期):

CREATE TABLE [dbo].[PostDate_Dimension](
    [post_date] [datetime] NOT NULL PRIMARY KEY,
    [day_of_year] [int] NOT NULL,
    [day_of_month] [int] NOT NULL,
    [month_of_year] [int] NOT NULL,
    [post_year]  AS (datepart(year,[post_date])),
    [post_month]  AS (datepart(month,[post_date])),
    [post_day]  AS (datepart(day,[post_date]))
)

Post Date 维度有四个属性(列出了成员键列,其中一些在 DSV 中计算):

  1. 日期(维度键)- post_date
  2. 月 - post_year, post_month
  3. 季度 - post_year,post_quarter =DatePart(quarter, "post_date"))
  4. 年份 - post_year

显然,这没什么太花哨的。我还有一些计算度量,它们使用 ParallelPeriod 来计算上一年的 YTD 数据,以便快速并排比较,而无需用户选择特定的日期片段。只需选择当前年份,它就会找到其中包含销售额的最新日期,然后与上一年的相同范围进行比较。

在上一年找到合适的日期通常归结为:

ParallelPeriod(
    [Post Date].[Post Date].[Year],
    1,
    Tail(
        NonEmpty(
            Descendants(
                [Post Date].CurrentMember,
                ,
                Leaves
            ),
            Measures.[Total Price]
        ),
        1
    ).Item(0)
)

Tail 调用是它在当前选定的 Post Date 成员(通常是当前年份)下查找最新日期的地方。这很好用。但是,如果返回 2 月 29 日,这意味着特定维度成员组合的最后一次销售发生在 2 月 29 日,那么它将 2 月 29 日传递给 ParallelPeriod 函数,该函数随后返回 null。然后上一年的 YTD 度量也返回 null。

所以,简而言之:基于这个特定的模式,有没有一种简单的方法可以让 ParallelPeriod 在 2 月 29 日的输入中表现良好?如果它只是返回上一年的 2 月 28 日,那很好。

编辑:

我尝试过的几件事:

  • 使用这个表达式来调整 Post Date 成员:
    Iif(MONTH([Post Date].[Post Date].CurrentMember.Member_Caption) = 2 And DAY([Post Date].[Post Date].CurrentMember.Member_Caption) = 29, [Post Date].[Post Date].CurrentMember.PREVMEMBER, [Post Date].[Post Date].CurrentMember)
    这行得通,但代码会很糟糕,因为我必须[Post Date].[Post Date].CurrentMember用Tail(NonEmpty(Descendants([Post Date].CurrentMember,, Leaves), Measures.[Total Price]), 1).Item(0)).
  • 使用 except 从结果中删除所有 2 月 29 日的日期NonEmpty(Descendants([Post Date].CurrentMember,, Leaves), Measures.[Total Price])。我无法找出正确的语法(如果有的话)来从维度中获取所有 2 月 29 日的集合。
  • 使用用户定义的函数创建一个 .NET 程序集,该函数将成员作为参数,如果是 2 月 29 日则返回前一个成员。似乎 Microsoft.AnalysisServices.AdomdServer 中的类非常有限,甚至没有允许这个基本任务(甚至不检索成员键作为日期值)。
ssas
  • 2 个回答
  • 2412 Views
Martin Hope
db2
Asked: 2012-02-22 10:06:06 +0800 CST

按需模糊查找

  • 6

我们有一个客户表(谁没有?),其中包含许多从业务角度来看是重复的记录。我已经能够创建一个 SSIS 包来执行模糊分组,并报告潜在的重复项。

现在,假设我想在有人进入新客户时进行这种分析。这个想法是对客户姓名(可能还有一些其他基本信息,如邮政编码)执行模糊查找,并在继续创建客户表单之前显示潜在的重复项。

这里明显的问题是模糊分组和查找组件是 SSIS 的一部分。如果我想按需运行这些,我必须做一些疯狂的事情,比如将搜索词放在临时表中,运行 SSIS 包,等待它完成,然后从输出表中获取结果。这会很慢,很痛苦,并且有严重的并发问题。

所以,另一个想法是使用全文索引。在尝试它时,它似乎不适合。它无法捕捉到客户名称的细微拼写错误,或者“Company”与“Corporation”与“Co.”或“Anderson”与“Andersen”以及其他此类变体中不同的名称。

有什么东西可以让 T-SQL 的模糊分组/匹配具有灵活性吗?我可以通过模糊查找来保存标记,但看起来我仍然需要重新实现大部分匹配算法才能使用它们。

sql-server sql-server-2008
  • 1 个回答
  • 6226 Views
Martin Hope
db2
Asked: 2012-01-28 06:23:23 +0800 CST

立即通过电子邮件提醒错误 229(权限被拒绝)

  • 3

出于某些原因,我希望将所有权限被拒绝的错误(编号 229)通过电子邮件发送给我。检查 master.sys.messages 显示此错误的 is_event_logged 为 0。因此排除了使用依赖于 SQL Server 错误日志的 SQL Server 代理错误警报(我测试过这个 - 我没有收到警报)。

我想我应该查看 mssqlsystemresource 并查看 sys.messages 的视图定义,想也许我可以更新 is_event_logged 以获取相关消息。但此视图从 中获取系统错误消息OpenRowset(TABLE SYSERRORS),因此这是不行的。

有没有一种相当简单的方法可以让我立即(或可能在 30 秒内)通过电子邮件将所有 229 个错误发送给我,而不会损害服务器性能?电子邮件之间 60 秒的冷却时间可能也是一个好主意。

sql-server sql-server-2008
  • 1 个回答
  • 712 Views
Martin Hope
db2
Asked: 2012-01-21 06:58:03 +0800 CST

向从任何主机连接的用户授予表权限

  • 6

我有一个用户帐户——我们称之为“wordpress”——我需要允许访问同一服务器上另一个电子商务数据库中的一些目录表。我为用户配置了三个允许连接的主机掩码:“localhost”、Web 服务器的 IP 地址和 Web 服务器的主机名。那里没有问题。

“wordpress”用户还可以完全访问自己的数据库,通过 MySQL Workbench 中的 Schema Privileges 部分授予。在这里,它显示主机是'%',这是我想要的,因为我不想为同一个用户管理三个重复的权限集。如果我查看 mysql.db,我会看到这些权限,在 Host 列中带有 '%'。

所以现在我想授予另一个数据库中少数表的 SELECT 权限——我们称之为“存储”。所以我试试这个:

GRANT SELECT ON store.catalog TO 'wordpress'@'%';

我得到“在用户表中找不到任何匹配的行”,原因很明显,“%”不是我明确允许来自该特定用户的连接的主机掩码。那么从任何允许的主机掩码向用户授予表权限的正确语法是什么?MySQL Workbench 是如何摆脱模式特权的?我不必手动将行插入 mysql.tables_priv,对吗?

更新:为了澄清,这是当前用户/授权表的样子。很明显,我已经匿名了一些名字。请注意,架构权限表中的主机是“%”,但该主机没有任何用户。我如何让 MySQL 让我通过模式对象授权来做到这一点?最好不要直接在 mysql.tables_priv 中乱搞,但如果归根结底,我会这样做。

mysql> SELECT user, host FROM mysql.user WHERE user = 'wordpress';
+-----------+-----------+
| user      | host      |
+-----------+-----------+
| wordpress | 10.0.0.22 |
| wordpress | webserver |
| wordpress | localhost |
+-----------+-----------+
3 rows in set (0.00 sec)

mysql> SELECT user, host, db, select_priv FROM mysql.db WHERE User = 'wordpress';
+-----------+------+----------------+-------------+
| user      | host | db             | select_priv |
+-----------+------+----------------+-------------+
| wordpress | %    | wordpress      | Y           |
| wordpress | %    | wordpress_test | Y           |
+-----------+------+----------------+-------------+
2 rows in set (0.00 sec)

mysql> SHOW GRANTS FOR 'wordpress'@'localhost';
+---------------------------------------------------------------------------+
| Grants for wordpress@localhost                                            |
+---------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'wordpress'@'localhost' IDENTIFIED BY PASSWORD '--' |
+---------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> SHOW GRANTS FOR 'wordpress'@'%';
ERROR 1141 (42000): There is no such grant defined for user 'wordpress' on host '%'

MySQL Workbench 是否正在使用模式/对象权限做一些可怕的未记录的事情?只是为了好玩,我向特定的 user@host 组合之一授予了一些表权限,然后更新了 mysql.tables_priv 以将主机更改为“%”。运行 FLUSH PRIVILEGES 后,它运行良好。诡异的。

mysql mysql-5.5
  • 2 个回答
  • 52274 Views
Martin Hope
db2
Asked: 2012-01-12 12:04:06 +0800 CST

记录所有用户错误消息以进行追溯性故障排除

  • 1

假设我想将所有严重性为 16(及更高)的用户错误消息记录到数据库表中,以便进行一些追溯性的应用程序故障排除(因为“你能把错误消息发给我吗?”的答案通常是“不,我关闭了它。”)服务器端跟踪将成为最有效的选择,还是会有更好的方法?

sql-server sql-server-2008
  • 1 个回答
  • 165 Views
Martin Hope
db2
Asked: 2011-12-24 05:47:10 +0800 CST

拒绝所有用户对特定模式中的对象的 INSERT/UPDATE/DELETE

  • 0

我有一个需要保护的与工资单相关的架构。我想如果我阻止所有用户直接修改表,并创建一组程序来处理所有数据修改,我们应该处于良好状态。我可以让程序处理所有审计日志,根据需要将事物包装在事务中,等等。

但要做到这一点,我需要拒绝对这个特定模式上的每个人的直接 DML 语句——甚至是 sysadmin 服务器角色。有没有任何简单的方法可以做到这一点而不诉诸 INSTEAD OF 触发器(这不会像防弹一样)?我没有看到像“DENY INSERT, UPDATE, DELETE ON SCHEMA::schemaname TO ALL”这样的语法,并且拒绝“public”角色的权限似乎没有达到预期的效果。

sql-server sql-server-2008
  • 1 个回答
  • 3781 Views
Martin Hope
db2
Asked: 2011-12-03 09:29:32 +0800 CST

日志卷的最佳块/条带大小?

  • 7

我知道 SQL Server 中数据量的常见建议是使用 64 KB 块/条带,因为 I/O 通常由整个扩展区完成。但是,我找不到任何关于日志文件 I/O 的好信息。

我已经在 Process Monitor 中观察了一段时间的 I/O 活动,看起来日志文件 I/O 大小从 512 字节到略低于 64 KB 不等。我猜这取决于记录的事务的大小,而大的事务会使用多个 ~64 KB 写入进行拆分。

所以,假设我的分区与 RAID 条带对齐,假设 64 KB 块/条带将产生最佳性能,在所有其他条件相同的情况下是否安全?我预计较小的事务,即具有 512 字节写入的事务,并不足以使大块大小的损失产生重大影响,而快速连续写入大量 64 KB 块的较大事务将更重要的是要调整。

sql-server sql-server-2008
  • 2 个回答
  • 5956 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve