我在工作中陷入了争论,我需要一些关于我可能忽略的可能陷阱的建议。
想象一下使用触发器将删除的记录复制到审计表的场景。触发器使用 SELECT *。每个人都指指点点,大喊大叫,告诉我们这有多糟糕。
但是,如果对主表的结构进行了修改,而忽略了审计表,那么触发器将产生一个错误,让人们知道审计表也需要修改。
该错误将在我们的 DEV 服务器上进行测试时被捕获。但是我们需要确保生产与 DEV 匹配,因此我们允许在生产系统中使用 SELECT * (仅限触发器)。
所以我的问题是:我被要求删除 SELECT *,但我不确定如何确保我们自动捕获这种性质的开发错误,任何想法或这是最佳实践?
我在下面整理了一个例子:
--Create Test Table
CREATE TABLE dbo.Test(ID INT IDENTITY(1,1), Person VARCHAR(255))
--Create Test Audit Table
CREATE TABLE dbo.TestAudit(AuditID INT IDENTITY(1,1),ID INT, Person VARCHAR(255))
--Create Trigger on Test
CREATE TRIGGER [dbo].[trTestDelete] ON [dbo].[Test] AFTER DELETE
NOT FOR REPLICATION
AS
BEGIN
SET NOCOUNT ON;
INSERT dbo.TestAudit([ID], [Person])
SELECT *
FROM deleted
END
--Insert Test Data into Test
INSERT INTO dbo.Test VALUES
('Scooby')
,('Fred')
,('Shaggy')
--Perform a …Run Code Online (Sandbox Code Playgroud) 我正在分析支持 3rd 方应用程序的 2008 实例。
该应用程序将生成 SQL 代码,然后将其作为临时查询发送到数据库。
我正在使用此查询(基于 Glenn Berry 脚本):
SELECT
qs.creation_time
,qs.last_execution_time
,qs.execution_count
,qs.total_worker_time
,qs.total_physical_reads
,qs.total_logical_writes
,qs.total_logical_reads
,qs.plan_handle
,qt.text
,qt.dbid
FROM
sys.dm_exec_query_stats AS qs WITH (NOLOCK)
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt
WHERE
qt.dbid >= 7
OPTION (RECOMPILE)
Run Code Online (Sandbox Code Playgroud)
我的问题是我正在为非常相似的查询获得数千个计划,即
SELECT * FROM customers WHERE name = 'bob'
SELECT * FROM customers WHERE name = 'bill'
Run Code Online (Sandbox Code Playgroud)
(实际上查询非常大,最多 3000 个字符)
这使得将数据转换为适合高级分析的格式几乎是不可能的。
是否可以快速比较 2 个 SQL 查询并查看它们是否几乎相同?然后我会随机选择其中一个查询,并将所有活动与该查询进行分组。(我试过 DIFFERENCE 但速度很慢)
SQL 是否已经存储了一个类似于 MD5 Hash sql_handle 的值,它允许它查看两个查询是否相似并因此重用相同的计划?(如果存在这样的值,那么我会对此进行分组)
我对存储过程没有这个问题,因为正在重用相同的计划。我只想将所有类似的临时人员组合在一起。
我们的第 3 方生产系统之一经历了重大升级,通过 sp_whoisactive,我现在看到很多查询(1 个事务深度),这些查询阻止了我读取 dm_db_missing_index_details 的任何尝试。
我尝试过设置事务隔离级别并使用 NOLOCK,但 SQL 只是当着我的面笑。
汉娜·弗农 (Hannah Vernon) 能够在这里复制这种行为。
有谁知道如何解决这个问题?
上周我们的系统遇到了一些奇怪的阻塞,Redgate Intellisense 是阻塞链的一部分,是否有其他DMV也有同样的问题?
我正在尝试在 SQL 2019 实例上备份 1.2TB 数据库。然后将备份恢复到 SQL 2014 实例。
我知道 SQL 不允许通过 .bak 或附加这样做。此外,数据库的大小使得脚本生成不太可能。
有谁知道Redgate SQL Backup 是否可以做到这一点?或者任何其他值得购买的软件。