数据库管理员

希望提高数据库技能并向社区中的其他人学习的数据库专业人员的问答

1
为什么MS SQL Server SEQUENCEs没有像Oracle这样的ORDER参数?
在T-SQL 的文档中CREATE SEQUENCE,您可以看到该CREATE SEQUENCE命令没有ORDER参数。 为了进行比较,用于CREATE SEQUENCE显示ORDER/ NOORDER选项的Oracle文档: ORDER 指定ORDER以确保按请求顺序生成序列号。如果将序列号用作时间戳,则此子句很有用。对于用于生成主键的序列,保证顺序通常并不重要。 ORDER仅在将Oracle数据库与Real Application Clusters一起使用时才有必要保证有序生成。如果使用独占模式,则序列号始终按顺序生成。 NOORDER 指定NOORDER是否不想保证按请求顺序生成序列号。这是默认值。 Microsoft SQL Server是否为SEQUENCEs 提供强大的排序约束?还是Microsoft总体上认为它不重要?

2
是否可以在LIKE语句上进行PIVOT
是否可以按表中的元素进行分组(如中所示COLUMN LIKE='Value%')PIVOT?我有一个表[DBT]。[Status],其中包含各种状态(数据库,实例等),并且不想将所有PROD和TEST值作为单个值进行透视/查询,而是将它们分组。 例如代替具有用于状态列Prod,Prod ACC,Prod APP,...等。我将仅有一个包含的值列Name LIKE 'Prod%'和Name LIKE 'Test%'。 到目前为止,我有: 表定义 CREATE TABLE [DBT].[Status]( [ID] [int] IDENTITY(1,1) NOT NULL, [Name] [nvarchar](50) NOT NULL, CONSTRAINT [PK_Status] PRIMARY KEY CLUSTERED ( [ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 80) …

4
如何故意对SQL Server索引进行分段?
我想在我拥有的SQL Server 2017测试数据库上有意创建坏索引条件,只是为了更好地理解这些维护脚本?SQL Server索引和统计信息维护 是否有快速/自动的方式来破坏索引完整性或增加索引碎片?您知道我有什么有用的资源可以实现这一目标吗?

1
如何找到现有数据库的FamilyGUID
执行RESTORE命令时,我了解SQL Server确保现有数据库不会被其他数据库覆盖。可以使用绕过此检查REPLACE。 我了解SQL Server使用备份文件FamilyGUID来确定要还原的数据库是否与被覆盖的数据库相同。它是否正确? 我了解FamilyGUID可以使用以下方法确定备份文件的 RESTORE headeronly FROM DISK = N'Q:\MyBackup.bak' 但是,如何找到被覆盖的数据库的FamilyGUID?

1
用于xml path('')输出
当我运行以下 select t.type from (values ('Green'),('Blue'),('Red')) as t(type) for xml path('') 我收到此输出 <type>Green</type> <type>Blue</type> <type>Red</type> 如果我运行以下 select t.type + '/' from (values ('Green'),('Blue'),('Red')) as t(type) for xml path('') 我收到此输出 Green/Blue/Red/ 为什么在select中添加串联会导致类型标签的删除和xml文件中一行的输出?运行SQL Server 2012。

3
如何在仅进行实际更改时触发T-SQL触发器?
我在UPDATE和INSERT上有一个表触发器,该触发器将行添加到另一个表中。如果更改了四列之一,则只需添加一行。我尝试使用IF UPDATE(col)来测试更改,但它有一个盲点。它仅测试是否引入了一些价值。我需要更深入地研究,我需要比较新旧价值,以查看是否发生了真正的变化。它必须同时使用INSERT和UPDATE。 在UPDATE的情况下很容易,因为插入和删除的表都具有我可以在触发器中比较的值。但是,对于INSERT,只有插入表具有值。因为我需要在同一触发器中完成所有操作,所以如何处理INSERT情况? 这是我要修改的触发器的脚本: ALTER TRIGGER [dbo].[trATPerson_alter] ON [mydb].[dbo].[AT_Person] AFTER INSERT,UPDATE AS BEGIN SET NOCOUNT ON; -- Not all updates require a push IF (UPDATE([First_Name]) OR UPDATE([Last_Name]) OR UPDATE([JobCode]) OR UPDATE([Inactive])) BEGIN INSERT INTO [mydb].[dbo].[AT_Person_To_Push] ( [Facility], [VendorID], [Person_code], [First_Name], [Last_Name], [JobCode], [Alink], [Inactive] ) SELECT [Facility], [VendorID], [Person_code], [First_Name], …
9 t-sql  trigger 

2
SELECT是否像VACUUM一样删除死行?
我在摆弄,VACUUM并注意到一些意外的行为,其中SELECT从表中读取行似乎减少了VACUUM以后的工作量。 测试数据 注意:自动真空已禁用 CREATE TABLE numbers (num bigint); ALTER TABLE numbers SET ( autovacuum_enabled = 'f', toast.autovacuum_enabled = 'f' ); INSERT INTO numbers SELECT generate_series(1, 5000); 试验1 现在,我们对所有行进行更新, UPDATE numbers SET num = 0; 当我们跑步时,VACUUM (VERBOSE) numbers;我们得到了, INFO: vacuuming "public.numbers" INFO: "numbers": removed 5000 row versions in 23 pages INFO: …

3
为什么此查询缺少FROM子句而不出错?
因此,我们有一个带有带有错字的子查询的查询。它缺少FROM子句。但是,当您运行它时,它不会出错!为什么!? SELECT 1 ,r.id ,'0D4133BE-C1B5-4141-AFAD-B171A2CCCE56' ,GETDATE() ,1 ,'Y' ,'N' ,oldItem.can_view ,oldItem.can_update FROM Role r JOIN RoleObject oldReport ON r.customer_id = oldReport.customer_id JOIN RoleItem oldItem ON oldReport.id = oldItem.role_object_id AND r.id = oldItem.role_id WHERE r.id NOT IN (SELECT role_id WHERE role_object_id = '0D4133BE-C1B5-4141-AFAD-B171A2CCCE56') AND oldReport.id = '169BA22F-1614-4EBA-AF45-18E333C54C6C'

1
显然,我的CLR汇编函数引起了死锁?
我们的应用程序需要与Oracle数据库或Microsoft SQL Server数据库同样良好地工作。为方便起见,我们创建了一些UDF以使查询语法同质。例如,SQL Server具有GETDATE(),而Oracle具有SYSDATE。它们执行相同的功能,但它们是不同的词。我们为两个平台编写了一个名为NOW()的包装UDF,该包装将相关的平台特定语法包装在一个通用函数名称中。我们还有其他这样的功能,其中一些功能实际上什么也不做,只是为了同质化而存在。不幸的是,这对于SQL Server是有成本的。内联标量UDF严重破坏性能,并完全禁用并行性。作为替代方案,我们编写了CLR汇编函数以实现相同的目标。当我们将其部署到客户端时,他们开始遇到频繁的死锁。这个特定的客户端正在使用复制和高可用性技术,我想知道这里是否存在某种交互。我只是不了解引入CLR函数将如何导致这样的问题。作为参考,我在C#中包含了原始的标量UDF定义以及替换的CLR定义,并为其提供了SQL声明。如果有帮助,我也可以提供死锁XML。 原始UDF CREATE FUNCTION [fn].[APAD] ( @Value VARCHAR(4000) , @tablename VARCHAR(4000) = NULL , @columnname VARCHAR(4000) = NULL ) RETURNS VARCHAR(4000) WITH SCHEMABINDING AS BEGIN RETURN LTRIM(RTRIM(@Value)) END GO CLR组装功能 [SqlFunction(IsDeterministic = true)] public static string APAD(string value, string tableName, string columnName) { return value?.Trim(); } …


3
在提交之前,SQL Server是否允许事务中的DDL(使其可见)到事务中?
在PostgreSQL中,我可以创建一个包含一些测试数据的表,然后在事务中将其迁移到其他类型的新列,从而在上重写一个表COMMIT, CREATE TABLE foo ( a int ); INSERT INTO foo VALUES (1),(2),(3); 其次是, BEGIN; ALTER TABLE foo ADD COLUMN b varchar; UPDATE foo SET b = CAST(a AS varchar); ALTER TABLE foo DROP COLUMN a; COMMIT; 但是,Microsoft SQL Server中的同一件事似乎会产生错误。比较此工作的db fiddle,其中ADD(column)命令在事务之外, -- txn1 BEGIN TRANSACTION; ALTER TABLE foo ADD b …


2
没有主键的表是否被标准化?
在一次演讲中,我的讲师向我们展示了一个没有主键的桌子。在询问时,他说在3NF中,当您删除传递依赖项时,可以有一个没有主键的表。 但是,没有主键意味着没有功能依赖关系-但是3NF消除了传递依赖关系,并且我被告知每个表都需要有一个用于规范化的主键,因为它全都与功能依赖关系有关。 我知道完全可以创建没有主键的表,但是如果该表存在,该数据库是否被视为规范化的? 我应该补充一点,该表没有任何“唯一键”,没有主键,没有复合键,没有外键。 所显示的表具有三个属性,没有一个被标记为主要或唯一。我问这是否是一个错误,他说没有一个是很好。我质疑此评论,因为表中的任何信息都无法唯一标识,他声称可以这样。这违背了我关于标准化的知识。

1
缺少的非聚集索引已成为聚集索引的一部分
我正在调试运行缓慢的查询,在执行计划中建议使用51.6648 Impact的非聚集索引。但是,非聚集索引仅包括主键(PK)复合聚集索引中已经存在的列。 难道是因为索引中列的顺序?即,如果聚集索引中的列从最有选择性到最少的顺序不顺序,那么非聚集索引是否有可能提高性能? 此外,非聚集索引仅包含三个PK列中的两个,而第三个添加为包含列。include使用非聚集索引可能会更优化的另一个原因吗? 以下是我正在使用的表结构的示例: 桌子- Retailers ( RetailerID int PK, name ...) Retailer_Relation_Types ( RelationType smallint PK, Description nvarchar(50) ...) Retailer_Relations ( RetailerID int PK FK, RelatedRetailerID int PK FK, RelationType smallint PK FK, CreatedOn datetime ...) 该表Retailer_Relations具有以下综合PK指数和建议指数- CONSTRAINT PK_Retailer_Relations PRIMARY KEY CLUSTERED ( RetailerID ASC, RelatedRetailerID ASC, RelationType …

1
授予拒绝权限堆叠
对于角色db_denycustomer,我只希望customer表的列代码是可选择的,而其他都不是。所以我这样做: DENY SELECT ON dbo.customer TO db_denycustomer GRANT SELECT ON dbo.customer (code) TO db_denycustomer ...而且效果很好。凉!但是,为什么呢? 我在相关文章中读到的是该权限栈,但DENY具有优先权。相反,在我的情况下,似乎最后一个权限“查询”优先。果然,如果我以相反的顺序执行它们,后者DENY也会隐藏代码列。 您能详细说明一下吗? 我还向测试的用户提供了默认值db_datawriter和db_datareader角色。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.