यदि मैं कोई टेबल या फ़ील्ड ड्रॉप करता हूं तो सभी संग्रहीत प्रक्रियाओं को कैसे जांचें SQL सर्वर में ठीक है?एसक्यूएल सर्वर में सभी संग्रहीत प्रक्रियाओं को कैसे जांचें ठीक है?
उत्तर
तरीके कि मन में इससे पहले कि आप मेज या एक क्षेत्र छोड़
- सबसे स्पष्ट तरीका प्रक्रियाओं मेज पर
- जांच निर्भरता चलाने आने की युगल। फिर उन निर्भर proceudres
- सभी प्रक्रियाओं पर स्क्रिप्ट उत्पन्न की जाँच और उस क्षेत्र या तालिका के लिए खोज
- क्वेरी sysobjects
यह सब कुछ (गतिशील एसक्यूएल या latebound वस्तुओं) पकड़ नहीं होगा, लेकिन यह हो सकता है उपयोगी - बाध्य संग्रहित प्रक्रियाओं (सुनिश्चित करने से पहले करने के लिए कि निर्भरता अपडेट किया जाता है और उसके बाद निर्भरता क्वेरी, या यह बाद में फोन और देखो तुम इसे कॉल कर सकते हैं अगर कुछ टूट गया है) सभी गैर स्कीमा पर 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
से मुकाबला करता है यह मेरे लिए वास्तव में अच्छा काम करता है। (हालांकि मेरे पास कोई ट्रिगर नहीं है) – ClearCloud8
अच्छी पोस्ट, सही काम करता है! एक और अतिरिक्त, आपको यह जांचना होगा कि ऑब्जेक्ट स्कीमा बाध्य है क्योंकि sp_refreshsqlmodule झूठी नकारात्मकता देगा क्योंकि स्कीमा बाध्य ऑब्जेक्ट समर्थित नहीं हैं। तो अपनी क्वेरी में निम्नलिखित जोड़ें: और \t isnull (objectproperty (o.object_id, 'IsSchemaBound'), 0) = 0 \t; –
माइकल Petito से स्क्रिप्ट के अलावा आप देर से ही सीमित वस्तुओं के साथ मुद्दों के लिए जाँच कर सकते हैं एस.पी. (आस्थगित नाम संकल्प) में इस तरह:
-- 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
समस्या यह है कि यह अभी भी सीटीई उपनाम और temp तालिकाओं को शून्य संदर्भ के रूप में वापस कर देगा। –
मैंने कोशिश की "कैड रॉक्स" उत्तर, यह गलत हो गया था और मैं निम्नलिखित
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
मैं मूल रूप से ऐसा ही किया था के रूप में यह तय हो गई है, लेकिन लिखा था यह करने के लिए सर्जरी रहित हो जो सुपर फास्ट है।
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
डेटा की एक तालिका के माध्यम से लूप को थोड़ी देर के कथन का उपयोग मूल रूप से fast_forward के साथ कर्सर का उपयोग करने जैसा ही होता है। दोनों पंक्तियों (आरबीएआर) agonizing द्वारा पंक्ति जा रहे हैं। यह एक ऐसी स्थिति है जहां यह स्वीकार्य है क्योंकि इसे सेट आधारित ऑपरेशन द्वारा प्रतिस्थापित नहीं किया जा सकता है। – Nicholas
कर्सर बहुत प्रदर्शन नहीं कर रहे हैं। वे स्मृति हॉग हैं। –
यह कर्सर का उपयोग करने से थोड़ा बेहतर प्रदर्शन करता है, भले ही यह अभी भी थोड़ी देर के लूप का उपयोग करता हो। –
- 1. एसक्यूएल सर्वर संग्रहीत प्रक्रियाओं और अनुमतियों
- 2. एसक्यूएल सर्वर 2005 में संग्रहीत प्रक्रियाओं में पाठ खोज
- 3. एसक्यूएल सीएलआर संग्रहीत प्रक्रियाओं में अपवाद फेंकना
- 4. एसक्यूएल संग्रहीत प्रक्रियाओं में कोड का पुन: उपयोग कैसे करें?
- 5. मैं समानांतर में एसक्यूएल सर्वर संग्रहीत प्रक्रियाओं को कैसे चला सकता हूं?
- 6. एसक्यूएल सर्वर लेनदेन के संबंध में संग्रहीत प्रक्रियाओं के अंदर बयान का इलाज कैसे करता है?
- 7. डेटाबेस के लिए SQL सर्वर में सभी संग्रहीत प्रक्रियाओं को कैसे गिनें?
- 8. एसक्यूएल सर्वर - संग्रहीत प्रक्रिया
- 9. सभी संग्रहीत प्रक्रियाओं के लिए अनुदान दें
- 10. एक स्ट्रिंग के लिए एसक्यूएल सर्वर 2008 आर 2 संग्रहीत प्रक्रियाओं को कैसे खोजा जाए?
- 11. एसक्यूएल सर्वर संग्रहीत प्रक्रिया फ़ोल्डर/समूह
- 12. LINQ क्वेरी बनाम संग्रहीत प्रक्रियाओं
- 13. एसक्यूएल सर्वर - क्या संग्रहीत प्रक्रिया
- 14. एसक्यूएल सर्वर में डेटा कैसे संग्रहीत किया जाता है?
- 15. संग्रहित प्रक्रियाओं में संदर्भित सभी तालिकाओं को नहीं ढूंढें
- 16. एसक्यूएल सर्वर - संग्रहित प्रक्रियाओं को एक डीबी से दूसरे
- 17. सी #/एसक्यूएल सभी संग्रहीत प्रक्रियाएं और उनके कोड
- 18. PHP से mySQL में संग्रहीत प्रक्रियाओं को कैसे सम्मिलित/बनाएँ?
- 19. रेल में संग्रहीत प्रक्रियाओं का उपयोग
- 20. एसक्यूएल संग्रहीत प्रक्रियाओं में टिप्पणियों के प्रदर्शन प्रभाव
- 21. संग्रहीत प्रक्रियाओं और कार्यों
- 22. एसक्यूएल सर्वर: संग्रहीत प्रक्रिया में वैकल्पिक चर
- 23. संस्करण को मेरे SQL सर्वर संग्रहीत प्रक्रियाओं को नियंत्रित करने का सबसे अच्छा तरीका क्या है?
- 24. एसक्यूएल सर्वर संग्रहीत प्रक्रिया को एसक्यूएल इंजेक्शन से सुरक्षित बनाना
- 25. संग्रहीत प्रक्रियाओं और इकाई परीक्षण
- 26. एसक्यूएल सर्वर में सभी निष्पादित प्रश्नों प्राप्त
- 27. एसक्यूएल सर्वर में गतिशील एसक्यूएल को कैसे साफ करें - एसक्यूएल इंजेक्शन
- 28. SQL संग्रहीत प्रक्रियाओं को चलाने की प्रगति को कैसे देखें?
- 29. संग्रहीत प्रक्रियाओं रिवर्स इंजीनियरिंग
- 30. सभी संग्रहित प्रक्रियाओं एक समारोह
ऐसा लगता है sp_refreshsqlmodule [तथापि गलत मॉड्यूल ताज़ा खत्म कर सकते हैं!] (Https://connect.microsoft.com/SQLServer/feedback/details/656863/sp-refreshsqlmodule-corrupts-renamed-objects-definitions) –
@ मार्टिन हां, मुझे इसका उल्लेख करना चाहिए था। मेरे मामले में, क्योंकि यह एक अल्टर था और उसी नाम का उपयोग करने की कोई और प्रक्रिया नहीं थी, मुझे एक त्रुटि मिली, इससे कुछ भी नुकसान नहीं हुआ। –