SQL सर्वर 2016 में तालिका नामकरण सम्मेलनों और नीति प्रबंधन के साथ समस्या


10

SQL सर्वर 2012 में, मेरे पास तालिका नाम में रिक्त स्थान न देने के लिए एक नीति सेट थी। हालाँकि, जब मैं SQL Server 2016 में समान नीति का उपयोग करता हूं, तो मुझे एक त्रुटि मिलती है।

यहाँ हालत के लिए कोड है:

DECLARE @condition_id INT
EXEC msdb.dbo.sp_syspolicy_add_condition @name=N'No Spaces', @description=N'No spaces in table names.', @facet=N'IMultipartNameFacet', @expression=N'<Operator>
  <TypeClass>Bool</TypeClass>
  <OpType>NOT_LIKE</OpType>
  <Count>2</Count>
  <Attribute>
    <TypeClass>String</TypeClass>
    <Name>Name</Name>
  </Attribute>
  <Constant>
    <TypeClass>String</TypeClass>
    <ObjType>System.String</ObjType>
    <Value>% %</Value>
  </Constant>
</Operator>', @is_name_condition=4, @obj_name=N'% %', @condition_id=@condition_id OUTPUT
SELECT @condition_id

यहाँ नीति के लिए कोड है:

DECLARE @object_set_id INT
EXEC msdb.dbo.sp_syspolicy_add_object_set @object_set_name=N'Table Names_ObjectSet', @facet=N'IMultipartNameFacet', @object_set_id=@object_set_id OUTPUT
SELECT @object_set_id

DECLARE @target_set_id INT
EXEC msdb.dbo.sp_syspolicy_add_target_set @object_set_name=N'Table Names_ObjectSet', @type_skeleton=N'Server/Database/Sequence', @type=N'SEQUENCE', @enabled=False, @target_set_id=@target_set_id OUTPUT
SELECT @target_set_id

EXEC msdb.dbo.sp_syspolicy_add_target_set_level @target_set_id=@target_set_id, @type_skeleton=N'Server/Database', @level_name=N'Database', @condition_name=N'', @target_set_level_id=0
EXEC msdb.dbo.sp_syspolicy_add_target_set_level @target_set_id=@target_set_id, @type_skeleton=N'Server/Database/Sequence', @level_name=N'Sequence', @condition_name=N'', @target_set_level_id=0

EXEC msdb.dbo.sp_syspolicy_add_target_set @object_set_name=N'Table Names_ObjectSet', @type_skeleton=N'Server/Database/StoredProcedure', @type=N'PROCEDURE', @enabled=False, @target_set_id=@target_set_id OUTPUT
SELECT @target_set_id

EXEC msdb.dbo.sp_syspolicy_add_target_set_level @target_set_id=@target_set_id, @type_skeleton=N'Server/Database', @level_name=N'Database', @condition_name=N'', @target_set_level_id=0
EXEC msdb.dbo.sp_syspolicy_add_target_set_level @target_set_id=@target_set_id, @type_skeleton=N'Server/Database/StoredProcedure', @level_name=N'StoredProcedure', @condition_name=N'', @target_set_level_id=0

EXEC msdb.dbo.sp_syspolicy_add_target_set @object_set_name=N'Table Names_ObjectSet', @type_skeleton=N'Server/Database/Synonym', @type=N'SYNONYM', @enabled=False, @target_set_id=@target_set_id OUTPUT
SELECT @target_set_id

EXEC msdb.dbo.sp_syspolicy_add_target_set_level @target_set_id=@target_set_id, @type_skeleton=N'Server/Database', @level_name=N'Database', @condition_name=N'', @target_set_level_id=0
EXEC msdb.dbo.sp_syspolicy_add_target_set_level @target_set_id=@target_set_id, @type_skeleton=N'Server/Database/Synonym', @level_name=N'Synonym', @condition_name=N'', @target_set_level_id=0

EXEC msdb.dbo.sp_syspolicy_add_target_set @object_set_name=N'Table Names_ObjectSet', @type_skeleton=N'Server/Database/Table', @type=N'TABLE', @enabled=True, @target_set_id=@target_set_id OUTPUT
SELECT @target_set_id

EXEC msdb.dbo.sp_syspolicy_add_target_set_level @target_set_id=@target_set_id, @type_skeleton=N'Server/Database', @level_name=N'Database', @condition_name=N'', @target_set_level_id=0
EXEC msdb.dbo.sp_syspolicy_add_target_set_level @target_set_id=@target_set_id, @type_skeleton=N'Server/Database/Table', @level_name=N'Table', @condition_name=N'', @target_set_level_id=0

EXEC msdb.dbo.sp_syspolicy_add_target_set @object_set_name=N'Table Names_ObjectSet', @type_skeleton=N'Server/Database/UserDefinedFunction', @type=N'FUNCTION', @enabled=False, @target_set_id=@target_set_id OUTPUT
SELECT @target_set_id

EXEC msdb.dbo.sp_syspolicy_add_target_set_level @target_set_id=@target_set_id, @type_skeleton=N'Server/Database', @level_name=N'Database', @condition_name=N'', @target_set_level_id=0
EXEC msdb.dbo.sp_syspolicy_add_target_set_level @target_set_id=@target_set_id, @type_skeleton=N'Server/Database/UserDefinedFunction', @level_name=N'UserDefinedFunction', @condition_name=N'', @target_set_level_id=0

EXEC msdb.dbo.sp_syspolicy_add_target_set @object_set_name=N'Table Names_ObjectSet', @type_skeleton=N'Server/Database/UserDefinedType', @type=N'TYPE', @enabled=False, @target_set_id=@target_set_id OUTPUT
SELECT @target_set_id

EXEC msdb.dbo.sp_syspolicy_add_target_set_level @target_set_id=@target_set_id, @type_skeleton=N'Server/Database', @level_name=N'Database', @condition_name=N'', @target_set_level_id=0
EXEC msdb.dbo.sp_syspolicy_add_target_set_level @target_set_id=@target_set_id, @type_skeleton=N'Server/Database/UserDefinedType', @level_name=N'UserDefinedType', @condition_name=N'', @target_set_level_id=0

EXEC msdb.dbo.sp_syspolicy_add_target_set @object_set_name=N'Table Names_ObjectSet', @type_skeleton=N'Server/Database/View', @type=N'VIEW', @enabled=False, @target_set_id=@target_set_id OUTPUT
SELECT @target_set_id

EXEC msdb.dbo.sp_syspolicy_add_target_set_level @target_set_id=@target_set_id, @type_skeleton=N'Server/Database', @level_name=N'Database', @condition_name=N'', @target_set_level_id=0
EXEC msdb.dbo.sp_syspolicy_add_target_set_level @target_set_id=@target_set_id, @type_skeleton=N'Server/Database/View', @level_name=N'View', @condition_name=N'', @target_set_level_id=0

EXEC msdb.dbo.sp_syspolicy_add_target_set @object_set_name=N'Table Names_ObjectSet', @type_skeleton=N'Server/Database/XmlSchemaCollection', @type=N'XMLSCHEMACOLLECTION', @enabled=False, @target_set_id=@target_set_id OUTPUT
SELECT @target_set_id

EXEC msdb.dbo.sp_syspolicy_add_target_set_level @target_set_id=@target_set_id, @type_skeleton=N'Server/Database', @level_name=N'Database', @condition_name=N'', @target_set_level_id=0
EXEC msdb.dbo.sp_syspolicy_add_target_set_level @target_set_id=@target_set_id, @type_skeleton=N'Server/Database/XmlSchemaCollection', @level_name=N'XmlSchemaCollection', @condition_name=N'', @target_set_level_id=0


GO

DECLARE @policy_id INT
EXEC msdb.dbo.sp_syspolicy_add_policy @name=N'Table Names', @condition_name=N'No Spaces', @policy_category=N'', @description=N'', @help_text=N'', @help_link=N'', @schedule_uid=N'00000000-0000-0000-0000-000000000000', @execution_mode=1, @is_enabled=True, @policy_id=@policy_id OUTPUT, @root_condition_name=N'', @object_set=N'Table Names_ObjectSet'
SELECT @policy_id


GO

SQL सर्वर 2012 और 2014 में, यह अपेक्षित परिणाम देता है:

CREATE TABLE [test table]
(Id INT NULL)

नीति 'तालिका नाम' का उल्लंघन 'SQLSERVER: \ SQL \ LSRSQL07 \ SQL2012 \ डेटाबेस \ परीक्षण \ तालिका \ dbo.test तालिका' द्वारा किया गया है। यह लेन-देन वापस चालू हो जाएगा। नीति की स्थिति: '@ नाम नहीं की तरह'% [-।]% 'और @ नाम नहीं की तरह'% [^ A-Za-z0-9 [_]]% '' नीति विवरण: '' अतिरिक्त सहायता: '': '' स्टेटमेंट: 'क्रिएट टेबल [टेस्ट टेबल] (आईडी INT NULL)'। Msg 3609, लेवल 16, स्टेट 1, प्रोसीजर sp_syspolicy_dispatch_event, Line 65 [बैच स्टार्ट लाइन 48] लेन-देन ट्रिगर में समाप्त हो गया। बैच निरस्त कर दिया गया है।

और अगर मैं निम्नलिखित कोड चलाता हूं, तो मुझे कोई त्रुटि नहीं मिलती है:

CREATE TABLE [testtable]
(Id INT NULL)

हालाँकि, यदि मैं CREATE TABLESQL सर्वर 2016 पर सक्षम नीति के साथ, कोई कथन चलाता हूं, तो मुझे निम्न त्रुटि मिलती है:

नीति 'तालिका नामों' का उल्लंघन 'SQLSERVER: \ SQL \ LSRSQL07 \ SQL2016 \ डेटाबेस \ परीक्षण \ Tables \ dbo.testtable' द्वारा किया गया है। यह लेन-देन वापस चालू हो जाएगा। नीति की स्थिति: '' '%%' का नाम न दें '' नीति का वर्णन: '' अतिरिक्त सहायता: '': '' कथन: '' रचना टेबल [परीक्षण योग्य] (Id INT NULL) ''। Msg 515, लेवल 16, स्टेट 2, प्रोसीजर sp_syspolicy_execute_policy, लाइन 69 [बैच स्टार्ट लाइन 44] NULL को कॉलम 'target_query_expression' में सम्मिलित नहीं कर सकता, टेबल - msdb.dbo.syspolicy_policy_execution_history_details_internal/ कॉलम नल की अनुमति नहीं देता है। INSERT विफल। बयान समाप्त कर दिया गया है।

SQL सर्वर 2016 में, मैं कोई तालिका नहीं बना सकता , चाहे वह शर्त पास करे या नहीं।

यह SQL Server 2016, SP1, CU3 है।

इस पर कोई विचार?

संपादित करें: मुझे "परिवर्तन पर: रोकथाम" के लिए मूल्यांकन मोड की आवश्यकता है

जवाबों:


6

SQL सर्वर 2016 SP1 CU2 आवृत्ति पर स्क्रिप्ट्स का परीक्षण किया गया है और मूल्यांकन मोड "परिवर्तन पर रोकें" पर सेट होने पर नीति काम करती है। ( एक बग है जो आपको विशिष्ट पहलुओं का उपयोग करने वाली नीतियों का मूल्यांकन नहीं करने देता है)।

इस बीच, यदि आप केवल तालिका नामों के लिए नीति का उपयोग करते हैं, तो आप समान कॉन्फ़िगरेशन ( @NAME NOT LIKE '% %') के साथ "मल्टीपार्टनाम" के बजाय "टेबल विकल्प" पहलू भी आज़मा सकते हैं ।


यदि मैंने मूल्यांकन मोड को "ऑन डिमांड" पर सेट किया है, तो यह काम करता है, लेकिन निष्पक्ष होने के लिए, मैंने पहले कोशिश नहीं की थी। मैं इसे बदलना पसंद करूंगा: लोगों को टेबल बनाने से रोकने और फिर बुरी तरह नामित तालिकाओं को संदर्भित करने वाले संग्रहीत प्रोक्स।
जॉन

मेरे लिए यह मूल्यांकन मोड को "ऑन डिमांड" सेट करने और नीति का मैन्युअल रूप से मूल्यांकन करने के लिए काम नहीं करता है। लेकिन यह ठीक काम करता है यदि मूल्यांकन "ऑन चेंज: प्रिवेंट" पर सेट है और टेबल बनाने का प्रयास करें। आप Microsoft कनेक्ट पर समस्या को पोस्ट करने का प्रयास कर सकते हैं ताकि यह पता लगाया जा सके कि यह बग है या नहीं।
ड्रैगोस

धन्यवाद, @ डाग्रास। क्या यह किसी भी मेज पर हो रहा है, यहां तक ​​कि उन लोगों को भी जो इस शर्त को पारित करना चाहिए?
जॉन

तालिकाएँ जिनके नाम में कोई सफ़ेद स्थान नहीं है, वे सफलतापूर्वक बन जाती हैं, और जिनके पास श्वेत स्थान होते हैं, वे नीति उल्लंघन त्रुटि के साथ विफल हो जाते हैं।
ड्रैगोस

हमारे पास संग्रहीत कार्यविधि और दृश्य पहलुओं के साथ एक ही समस्या है। हम SQL 2016 SP1 CU3 (नवीनतम) पर हैं। जैसे जॉन ने कहा, यह एक बग की तरह लगता है, लेकिन क्या कोई सोच रहा था कि कोई वर्कअराउंड कर सकता है?
DBAuser
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.