如果我删除一个表或字段,如何检查所有存储过程在sql服务器中是否正常?如何在sql server中检查所有存储过程是否正常?
回答
夫妇的我想到你删除表或现场之前
- 最明显的方法这个表上运行的程序
- 检查依赖的方式。再看看那些依赖proceudres
- 产生的所有程序脚本,并搜索字段或表
- 查询系统对象
它没有捕捉一切(动态SQL或后期绑定的对象),但它可以是有用的 - 呼吁所有非模式sp_refreshsqlmodule约束存储过程(也可以称之为前确保依赖更新,然后查询的相关性,或事后调用它,看有无破损):
DECLARE @template AS varchar(max)
SET @template = 'PRINT ''{OBJECT_NAME}''
EXEC sp_refreshsqlmodule ''{OBJECT_NAME}''
'
DECLARE @sql AS varchar(max)
SELECT @sql = ISNULL(@sql, '') + REPLACE(@template, '{OBJECT_NAME}',
QUOTENAME(ROUTINE_SCHEMA) + '.'
+ QUOTENAME(ROUTINE_NAME))
FROM INFORMATION_SCHEMA.ROUTINES
WHERE OBJECTPROPERTY(OBJECT_ID(QUOTENAME(ROUTINE_SCHEMA) + '.'
+ QUOTENAME(ROUTINE_NAME)),
N'IsSchemaBound') IS NULL
OR OBJECTPROPERTY(OBJECT_ID(QUOTENAME(ROUTINE_SCHEMA) + '.'
+ QUOTENAME(ROUTINE_NAME)),
N'IsSchemaBound') = 0
EXEC (
@sql
)
我找到凯德回答我们eful在制定自己的脚本在数据库中检查的对象,所以我想我会分享我的剧本,以及:
DECLARE @Name nvarchar(1000);
DECLARE @Sql nvarchar(1000);
DECLARE @Result int;
DECLARE ObjectCursor CURSOR FAST_FORWARD FOR
SELECT QUOTENAME(SCHEMA_NAME(o.schema_id)) + '.' + QUOTENAME(OBJECT_NAME(o.object_id))
FROM sys.objects o
WHERE type_desc IN (
'SQL_STORED_PROCEDURE',
'SQL_TRIGGER',
'SQL_SCALAR_FUNCTION',
'SQL_TABLE_VALUED_FUNCTION',
'SQL_INLINE_TABLE_VALUED_FUNCTION',
'VIEW')
--include the following if you have schema bound objects since they are not supported
AND ISNULL(OBJECTPROPERTY(o.object_id, 'IsSchemaBound'), 0) = 0
;
OPEN ObjectCursor;
FETCH NEXT FROM ObjectCursor INTO @Name;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @Sql = N'EXEC sp_refreshsqlmodule ''' + @Name + '''';
--PRINT @Sql;
BEGIN TRY
EXEC @Result = sp_executesql @Sql;
IF @Result <> 0 RAISERROR('Failed', 16, 1);
END TRY
BEGIN CATCH
PRINT 'The module ''' + @Name + ''' does not compile.';
IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION;
END CATCH
FETCH NEXT FROM ObjectCursor INTO @Name;
END
CLOSE ObjectCursor;
DEALLOCATE ObjectCursor;
刷新触发器的唯一方法是在未加密的情况下更改它们。 (http://connect.microsoft.com/SQLServer/feedback/details/261905/sp-refreshsqlmodule-does-not-work-with-triggers)。因此,上面的脚本在遇到触发时会产生误报 – buckley 2012-02-16 09:22:09
这对我来说非常合适。 (虽然我没有任何触发器) – ClearCloud8 2014-05-29 21:10:21
好帖子,作品完美!还有一点,您必须检查对象是否与模式绑定,因为不支持模式绑定对象,sp_refreshsqlmodule会给出错误否定。因此,添加到您的查询以下:和 \t isnull(objectproperty(o.object_id,'IsSchemaBound'),0)= 0 \t; – 2014-09-05 19:41:15
除了迈克尔Petito脚本可以用后期绑定对象检查问题在的SP(延迟名称解析)是这样的:
-- Based on comment from http://blogs.msdn.com/b/askjay/archive/2012/07/22/finding-missing-dependencies.aspx
-- Check also http://technet.microsoft.com/en-us/library/bb677315(v=sql.110).aspx
select o.type, o.name, ed.referenced_entity_name, ed.is_caller_dependent
from sys.sql_expression_dependencies ed
join sys.objects o on ed.referencing_id = o.object_id
where ed.referenced_id is null
问题是它仍然会返回CTE别名和临时表作为空引用。 – 2017-06-29 17:32:08
我试过“凯德鲁”的回答,出了问题,我修好了如下
SELECT 'BEGIN TRAN T1;' UNION
SELECT REPLACE('BEGIN TRY
EXEC sp_refreshsqlmodule ''{OBJECT_NAME}''
END TRY
BEGIN CATCH
PRINT ''{OBJECT_NAME} IS INVALID.''
END CATCH', '{OBJECT_NAME}',
QUOTENAME(ROUTINE_SCHEMA) + '.'
+ QUOTENAME(ROUTINE_NAME))
FROM INFORMATION_SCHEMA.ROUTINES
WHERE OBJECTPROPERTY(OBJECT_ID(QUOTENAME(ROUTINE_SCHEMA) + '.'
+ QUOTENAME(ROUTINE_NAME)),
N'IsSchemaBound') IS NULL
OR OBJECTPROPERTY(OBJECT_ID(QUOTENAME(ROUTINE_SCHEMA) + '.'
+ QUOTENAME(ROUTINE_NAME)),
N'IsSchemaBound') = 0
UNION
SELECT 'ROLLBACK TRAN T1;'
请格式化代码。 – rajuGT 2015-10-01 15:35:16
我基本上做同样的事情,但写它来是超快的CURSORless。
DECLARE @Name nvarchar(1000);
DECLARE @Sql nvarchar(1000);
DECLARE @Result int;
DECLARE @Objects TABLE (
Id INT IDENTITY(1,1),
Name nvarchar(1000)
)
INSERT INTO @Objects
SELECT QUOTENAME(SCHEMA_NAME(o.schema_id)) + '.' + QUOTENAME(OBJECT_NAME(o.object_id))
FROM sys.objects o
WHERE type_desc IN (
'SQL_STORED_PROCEDURE',
'SQL_TRIGGER',
'SQL_SCALAR_FUNCTION',
'SQL_TABLE_VALUED_FUNCTION',
'SQL_INLINE_TABLE_VALUED_FUNCTION',
'VIEW')
--include the following if you have schema bound objects since they are not supported
AND ISNULL(OBJECTPROPERTY(o.object_id, 'IsSchemaBound'), 0) = 0
DECLARE @x INT
DECLARE @xMax INT
SELECT @xMax = MAX(Id) FROM @Objects
SET @x = 1
WHILE @x < @xMax
BEGIN
SELECT @Name = Name FROM @Objects WHERE Id = @x
SET @Sql = N'EXEC sp_refreshsqlmodule ''' + @Name + '''';
--PRINT @Sql;
BEGIN TRY
EXEC @Result = sp_executesql @Sql;
IF @Result <> 0 RAISERROR('Failed', 16, 1);
END TRY
BEGIN CATCH
PRINT 'The module ''' + @Name + ''' does not compile.';
IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION;
END CATCH
SET @x = @x + 1
END
使用while语句遍历数据表基本上与使用fast_forward的游标相同。两个人都在排队(RBAR)。这是一种可接受的情况,因为它不能被基于集合的操作取代。 – Nicholas 2016-01-12 03:50:23
游标不是很高效。他们是记忆猪。 – 2016-01-15 02:37:03
这比使用游标执行得更好一些,即使它仍然使用while循环。 – 2016-02-18 14:17:05
- 1. 如何检查SQL Azure中是否存在存储过程?
- 2. 检查存储过程是否有效
- 3. 如何检查哪个存储过程查询正在运行Sql Server Asp.Net?
- 4. Excel VBA代码来检查SQL Server 2014上是否存在存储过程
- 5. SQL Server存储过程 - 检查是否有任何记录存在,然后插入如果不是
- 6. 检查,如果条件在存储过程(SQL Server 2005中)
- 7. 检查Sql Server中存储过程的有效性
- 8. 如何在SQL Server中检查存储过程中的当前SQL语句
- 9. 如何检查存储过程是否存在?
- 10. 语法检查所有存储过程?
- 11. 如何检查存储过程是否没有错误?
- 12. 检查存储过程是否正在运行?
- 13. 检查是否选择查询的SQL Server内部的结果存储过程
- 14. SQL Server - 是否有可能逐步通过存储过程
- 15. Azure/Powershell:检查SQL Server是否存在
- 16. SQL Server中的所有存储过程都存储在哪个数据库中?
- 17. 在MS SQL Server中存储查询与存储过程
- 18. 如何检查SQL Server中是否存在列?
- 19. 如何检查SQL Server中是否存在表的列表?
- 20. MS SQL Server:检查用户是否可以执行存储过程
- 21. 检查存储过程是否存在于数据库中?
- 22. 检查存储过程是否存在于ADO.Net中?
- 23. SQL Server的检查,如果存储过程(NOLOCK)
- 24. 如何在SQL Server中有条件地创建存储过程?
- 25. 如何检索SQL Server中存储过程的名称?
- 26. 什么是检查SQL Server 2005存储过程中是否存在文件的最佳方法?
- 27. 检查存储过程是否包含正确的表名
- 28. 如何在SQL Server数据库中一次性删除所有存储过程?
- 29. SQL Server - 存储过程查询性能
- 30. 解释SQL Server存储过程/查询
看来sp_refreshsqlmodule [可最终却刷新了错误的模块!(https://connect.microsoft.com/SQLServer/feedback/details/656863/sp-refreshsqlmodule-corrupts-renamed-objects-definitions ) – 2011-04-01 19:59:17
@Martin是的,我应该提到这一点。在我的情况下,因为它是一个ALTER,并没有另一个过程使用相同的名称,我得到了一个错误,它没有任何伤害。 – 2011-04-02 15:45:20