小编pac*_*ely的帖子

SELECT * 在触发器中是否正常。还是我自找麻烦?

我在工作中陷入了争论,我需要一些关于我可能忽略的可能陷阱的建议。

想象一下使用触发器将删除的记录复制到审计表的场景。触发器使用 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)

sql-server t-sql

8
推荐指数
2
解决办法
5050
查看次数

将 sys.dm_exec_sql_text 中的相似查询组合在一起

我正在分析支持 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 的值,它允许它查看两个查询是否相似并因此重用相同的计划?(如果存在这样的值,那么我会对此进行分组)

我对存储过程没有这个问题,因为正在重用相同的计划。我只想将所有类似的临时人员组合在一起。

sql-server-2008 sql-server dmv plan-cache

3
推荐指数
1
解决办法
153
查看次数

为什么我不能对 dm_db_missing_index_details 进行脏读

我们的第 3 方生产系统之一经历了重大升级,通过 sp_whoisactive,我现在看到很多查询(1 个事务深度),这些查询阻止了我读取 dm_db_missing_index_details 的任何尝试。

我尝试过设置事务隔离级别并使用 NOLOCK,但 SQL 只是当着我的面笑。

汉娜·弗农 (Hannah Vernon) 能够在这里复制这种行为。

有谁知道如何解决这个问题?

上周我们的系统遇到了一些奇怪的阻塞,Redgate Intellisense 是阻塞链的一部分,是否有其他DMV也有同样的问题?

sql-server sql-server-2019

2
推荐指数
1
解决办法
143
查看次数

Redgate SQL 备份可以将 SQB 恢复到较旧的 SQL 版本

我正在尝试在 SQL 2019 实例上备份 1.2TB 数据库。然后将备份恢复到 SQL 2014 实例。

我知道 SQL 不允许通过 .bak 或附加这样做。此外,数据库的大小使得脚本生成不太可能。

有谁知道Redgate SQL Backup 是否可以做到这一点?或者任何其他值得购买的软件。

sql-server

0
推荐指数
1
解决办法
126
查看次数