2010-06-12 3 views

उत्तर

2

तरीके कि मन में इससे पहले कि आप मेज या एक क्षेत्र छोड़

  1. सबसे स्पष्ट तरीका प्रक्रियाओं मेज पर
  2. जांच निर्भरता चलाने आने की युगल। फिर उन निर्भर proceudres
  3. सभी प्रक्रियाओं पर स्क्रिप्ट उत्पन्न की जाँच और उस क्षेत्र या तालिका के लिए खोज
  4. क्वेरी sysobjects
6

यह सब कुछ (गतिशील एसक्यूएल या 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 
      ) 
+1

ऐसा लगता है sp_refreshsqlmodule [तथापि गलत मॉड्यूल ताज़ा खत्म कर सकते हैं!] (Https://connect.microsoft.com/SQLServer/feedback/details/656863/sp-refreshsqlmodule-corrupts-renamed-objects-definitions) –

+0

@ मार्टिन हां, मुझे इसका उल्लेख करना चाहिए था। मेरे मामले में, क्योंकि यह एक अल्टर था और उसी नाम का उपयोग करने की कोई और प्रक्रिया नहीं थी, मुझे एक त्रुटि मिली, इससे कुछ भी नुकसान नहीं हुआ। –

42

मैं कैड का जवाब हमें मिला एक डेटाबेस में वस्तुओं की जाँच के लिए अपने ही स्क्रिप्ट तैयार करने में 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; 
+2

ट्रिगर को रीफ्रेश करने का एकमात्र तरीका उनको बदलना है यदि एन्क्रिप्टेड नहीं है। (Http://connect.microsoft.com/SQLServer/feedback/details/261905/sp-refreshsqlmodule-does-not-work-with-triggers)। तो ऊपर की लिपि झूठी सकारात्मक देता है जब यह एक ट्रिगर – buckley

+0

से मुकाबला करता है यह मेरे लिए वास्तव में अच्छा काम करता है। (हालांकि मेरे पास कोई ट्रिगर नहीं है) – ClearCloud8

+4

अच्छी पोस्ट, सही काम करता है! एक और अतिरिक्त, आपको यह जांचना होगा कि ऑब्जेक्ट स्कीमा बाध्य है क्योंकि sp_refreshsqlmodule झूठी नकारात्मकता देगा क्योंकि स्कीमा बाध्य ऑब्जेक्ट समर्थित नहीं हैं। तो अपनी क्वेरी में निम्नलिखित जोड़ें: और \t isnull (objectproperty (o.object_id, 'IsSchemaBound'), 0) = 0 \t; –

2

माइकल 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 
+0

समस्या यह है कि यह अभी भी सीटीई उपनाम और temp तालिकाओं को शून्य संदर्भ के रूप में वापस कर देगा। –

1

मैंने कोशिश की "कैड रॉक्स" उत्तर, यह गलत हो गया था और मैं निम्नलिखित

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;' 
+0

कृपया कोड प्रारूपित करें। – rajuGT

3

मैं मूल रूप से ऐसा ही किया था के रूप में यह तय हो गई है, लेकिन लिखा था यह करने के लिए सर्जरी रहित हो जो सुपर फास्ट है।

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 
+1

डेटा की एक तालिका के माध्यम से लूप को थोड़ी देर के कथन का उपयोग मूल रूप से fast_forward के साथ कर्सर का उपयोग करने जैसा ही होता है। दोनों पंक्तियों (आरबीएआर) agonizing द्वारा पंक्ति जा रहे हैं। यह एक ऐसी स्थिति है जहां यह स्वीकार्य है क्योंकि इसे सेट आधारित ऑपरेशन द्वारा प्रतिस्थापित नहीं किया जा सकता है। – Nicholas

+0

कर्सर बहुत प्रदर्शन नहीं कर रहे हैं। वे स्मृति हॉग हैं। –

+0

यह कर्सर का उपयोग करने से थोड़ा बेहतर प्रदर्शन करता है, भले ही यह अभी भी थोड़ी देर के लूप का उपयोग करता हो। –

संबंधित मुद्दे

 संबंधित मुद्दे