এই আপডেটটি কেন অনন্য কী বাধা লঙ্ঘন করে ব্যর্থ হয়?


11

আমি একটি "দুর্ঘটনাজনিত" ডিবিএ, তুলনামূলকভাবে অনভিজ্ঞ এবং এই সমস্যায় অবাক হয়েছি।

এমএস এসকিউএল সার্ভার ২০১২ চলছে। সমস্যাটি এই আপডেটের বিবৃতিতে রয়েছে:

UPDATE dbo.tAccts SET
       Ticket               = 'ARP.ExGE'
       , Method             = 'smtp'
       , AcctOwner          = 'r00417819'
       , DisplayName = '~AppLight HBSFax-Inactive'
       , Destination = 'r00417819@mail.ad.ge.com'
       , UpdatedBy          = SYSTEM_USER
       , UpdatedOn          = CAST(GetDate() AS DATE)
FROM dbo.vReclaimable
WHERE OHR_EmpStatus <> 'A'

কোনটি উচিত আপডেট শুধুমাত্র tAccts টেবিল যা vReclaimable দৃশ্য দ্বারা ফিরে হয় সারি।

ভিআরসিলেবলযোগ্য ভিউ টিএসিটিএস টেবিলের উপর ভিত্তি করে tAccts এ সারিগুলির একটি উপসেট প্রদান করে।

আমি যখন এটি চালাব, এটি একটি অনন্য কী ত্রুটিতে ব্যর্থ হয়েছে:

(0 row(s) affected)
Msg 2627, Level 14, State 1, Line 67
Violation of UNIQUE KEY constraint 'UQ__tAccounts_DNIS.Method.Destination.Phones'. Cannot insert duplicate key in object 'dbo.tAccts'. The duplicate key value is (68497, smtp, r00417819@mail.ad.ge.com, 800-905-8793, none).
The statement has been terminated.

পর্যাপ্ত পরিমাণে, টিএসিটিএস টেবিলে একটি অনন্য কী বাধা থাকে:

CONSTRAINT [UQ__tAccounts_DNIS.Method.Destination.Phones] UNIQUE NONCLUSTERED 
(
                [DNIS] ASC,[Method] ASC,[Destination] ASC,[Phone_TF] ASC,[Phone_Local] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) 

তবে এখানে অদ্ভুত জিনিস। যদি আমি এই দুটি কোয়েরি চালাই:

select 'tAccts table', dnis, method, destination, phone_tf, phone_local from tAccts where dnis=68497
select 'vReclaimable view', dnis, method, destination, phone_tf, phone_local, daysidle from vReclaimable where dnis=68497

প্রথমটি দুটি সারি (প্রত্যাশার মতো) প্রদান করে:

(No column name)     dnis   method destination   phone_tf      phone_local
tAccts table  68497  ftp    ftp://faxuser@ap1plm02cige/appliances    800-905-8793  none
tAccts table  68497  unc    \\\\for4as01applge\\cfs_portfolio\\cfs_faxdocs  800-905-8793  none

এবং দ্বিতীয়টি 0 টি সারি দেয় (প্রত্যাশার মতো)।

যদি "ওচআর_এম্পস্ট্যাটাস << 'এ' থেকে 0 টি সারি ফিরে আসে, তবে আপডেট কেন DNIS = 68497 সারিটি আপডেট করার চেষ্টা করছে?

(আমি আশা করি আমি এটি যথাযথভাবে বর্ণনা করেছি I've আমি অনুভূতিতে আমি স্পষ্ট কিছু মিস করছি)

USE [TEST-GEAFax_arley_NEW]
GO

/****** Object:  Table [dbo].[tAccts]    Script Date: 12/9/2015 1:39:41 PM ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[tAccts](
    [Ticket] [varchar](30) NOT NULL,
    [Method] [varchar](15) NOT NULL,
    [AcctOwner] [varchar](15) NOT NULL,
    [DisplayName] [varchar](75) NOT NULL,
    [Destination] [varchar](75) NOT NULL,
    [DNIS] [varchar](20) NOT NULL,
    [DNIS2] [varchar](20) NULL,
    [Phone_TF] [varchar](30) NOT NULL,
    [Phone_Local] [varchar](30) NOT NULL,
    [Phone_PBX] [varchar](255) NOT NULL,
    [UpdatedBy] [varchar](50) NOT NULL,
    [UpdatedOn] [date] NOT NULL,
    [FaxNotes] [varchar](255) NULL,
    [TelcomNotes] [varchar](255) NULL,
    [AcctID] [int] IDENTITY(0,1) NOT NULL,
 CONSTRAINT [PK__tAccounts_AcctID] PRIMARY KEY CLUSTERED 
(
    [AcctID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY],
 CONSTRAINT [UQ__tAccounts_DNIS.Method.Destination.Phones] UNIQUE NONCLUSTERED 
(
    [DNIS] ASC,
    [Method] ASC,
    [Destination] ASC,
    [Phone_TF] ASC,
    [Phone_Local] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

---------------------------------------------------------------------------------

USE [TEST-GEAFax_arley_NEW]
GO

/****** Object:  View [dbo].[vReclaimable]    Script Date: 12/9/2015 1:39:57 PM ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO


/***********************************************************************
* Written By    : N. Arley Dealey (200018252
* Written On    :
* Updated By    :
* Updated On    :
* Description   : Returns data from tAccts, vRxAl, vWLT_AllGE
* Notes         :
***********************************************************************/
CREATE VIEW [dbo].[vReclaimable] AS
SELECT
        a.Ticket
        , a.Method
        , a.AcctOwner
        , a.DisplayName
        , a.Destination
        , a.DNIS
        , a.DNIS2
        , a.Phone_TF
        , a.Phone_Local
        , a.Phone_PBX
        , a.UpdatedBy
        , a.UpdatedOn
        , a.FaxNotes
        , a.TelcomNotes
        , a.AcctID
        , COUNT(jt.JobID) AS 'FaxesRcvd'
        , CAST(MIN(jt.TimeStamp_UTC) AS DATE) AS 'FirstRcvd'
        , CAST(MAX(jt.TimeStamp_UTC) AS DATE) AS 'LastRcvd'
        , DATEDIFF(dd, MAX(jt.TimeStamp_UTC), GETDATE()) AS 'DaysIdle'
        , o.OHR_EmpSSO
        , o.OHR_EmpStatus
        , o.OHR_EmpName
        , o.OHR_EmpTitle
        , o.OHR_BizIndustryGroup
        , o.OHR_BizSegment
        , o.OHR_BizUnit
        , o.OHR_BizDept
        , o.OHR_BizDomain
FROM
    dbo.tAccts AS a
    LEFT OUTER JOIN dbo.tAccts_Retain AS r ON (a.AcctID = r.AcctID)
    LEFT OUTER JOIN dbo.vWLT_AllGE AS o ON (a.AcctOwner = o.OHR_EmpSSO)
    LEFT OUTER JOIN dbo.vRxAll AS jt ON (a.DNIS = jt.DNIS)
    WHERE ( 1                                               -- place holder, has no effect
            AND r.RetainID IS NULL                          -- out of scope: in Retain table
            AND a.Method = 'smtp'                           -- out of scope: ftp, unc, cifs, printers
            AND a.Phone_Local NOT LIKE '216-%'              -- out of scope: NELA numbers
            AND a.AcctOwner <> 'r00417819'                  -- out of scope: reclaimed numbers
            AND a.AcctOwner <> 'r00336832'                  -- out of scope: never assigned numbers
            AND a.AcctOwner <> 'r00971729'                  -- out of scope: invalid numbers
            AND a.Destination NOT LIKE 'g%@mail.ad.ge.com'  -- out of scope: distribution lists
            AND a.Destination NOT LIKE 'r%@mail.ad.ge.com'  -- out of scope: shared mailboxes
        )
    GROUP BY
        a.DNIS
        -- remaining columns are just for syntax reasons
        , a.Ticket, a.Method, a.AcctOwner, a.DisplayName, a.Destination, a.DNIS2, a.Phone_TF, a.Phone_Local, a.Phone_PBX, a.UpdatedBy, a.UpdatedOn, a.FaxNotes, a.TelcomNotes, a.AcctID
        , o.OHR_EmpSSO, o.OHR_EmpStatus, o.OHR_EmpName, o.OHR_EmpTitle
        , o.OHR_BizIndustryGroup, o.OHR_BizSegment, o.OHR_BizUnit, o.OHR_BizDept, o.OHR_BizDomain

GO

আমাদের CREATE VIEWবিবৃতি প্রদর্শন করুন ।
ypercubeᵀᴹ

এবং OHR_EmpStatusটেবিলের একটি কলাম, দেখুন বা উভয়?
ypercubeᵀᴹ

1
আমার প্রশ্নের তাত্ক্ষণিক ও দুর্দান্ত প্রতিক্রিয়ার পরিমাণে আমি কেবলমাত্র অসাধারণ। যেমনটি আমি বলেছিলাম, এটি সম্ভবত স্পষ্ট কিছু যা আমি উপেক্ষা করেছি বা ভুল বোঝাবুঝি করেছি তবে আমি মনে করি না কারণ এটি ক্রস-যোগ দিয়ে শেষ করেছি। TCccts টেবিল এবং vRlalalable ভিউ জন্য সংজ্ঞা পোস্ট করা উচিত। আমি এখনও অবধি পোস্ট করা সমস্ত উত্তর পর্যালোচনা করব এবং, যদি আমি এখনও মনে করি সেগুলি লক্ষ্যমাত্রায় সঠিক নয়, তবে আমি এই সংজ্ঞাগুলি প্রশ্নের সাথে যুক্ত করব। ইতিমধ্যে, প্রতিক্রিয়া জানিয়েছেন প্রত্যেককে একটি বিশাল ধন্যবাদ।
আর্লেডি

Ypercube দ্বারা অনুরোধ করা হিসাবে, TAccts এবং vReclaimable উভয়ের জন্য ক্রিয়েট স্টেটমেন্ট যুক্ত করা
আর্লিডি

উত্তর:


18

এটি কী UPDATEবিবৃতি দেয় তা ফোটায় । এটি সম্পূর্ণ সুস্পষ্ট নয় তবে আপনার বক্তব্যটি এর সাথে সমান:

UPDATE upd SET
         Ticket             = 'ARP.ExGE'
       , Method             = 'smtp'
       , AcctOwner          = 'r00417819'
       , DisplayName = '~AppLight HBSFax-Inactive'
       , Destination = 'r00417819@mail.ad.ge.com'
       , UpdatedBy          = SYSTEM_USER
       , UpdatedOn          = CAST(GetDate() AS DATE)
FROM 
    dbo.tAccts AS upd 
  CROSS JOIN
    dbo.vReclaimable AS v
WHERE OHR_EmpStatus <> 'A' ;

যেহেতু dbo.tAcctsটেবিলের কোনও উল্লেখ নেই FROMএবং যোগদানের কোনও অংশ নেই বা টেবিল এবং দৃশ্যের মধ্যে শর্ত রয়েছে তাই এটি একটি CROSSযোগদান এবং টেবিলের সমস্ত সারি আপডেট করার চেষ্টা করে (এবং কেবল প্রদর্শন থেকে নয়) এবং সম্ভবত একাধিক পাশাপাশি বার!


আপনি এর সাথে একটি যোগদান (বা যেখানে) শর্ত যুক্ত করতে পারেন:

UPDATE upd SET
         Ticket             = 'ARP.ExGE'
       , Method             = 'smtp'
       , AcctOwner          = 'r00417819'
       , DisplayName = '~AppLight HBSFax-Inactive'
       , Destination = 'r00417819@mail.ad.ge.com'
       , UpdatedBy          = SYSTEM_USER
       , UpdatedOn          = CAST(GetDate() AS DATE)
FROM 
    dbo.tAccts AS upd 
  JOIN
    dbo.vReclaimable AS v
      ON v.PK = upd.PK              -- whatever the PK column is
WHERE OHR_EmpStatus <> 'A' ;

বা (আপনার সংস্করণ ব্যবহার করে):

UPDATE dbo.tAccts SET
       Ticket               = 'ARP.ExGE'
       , Method             = 'smtp'
       , AcctOwner          = 'r00417819'
       , DisplayName = '~AppLight HBSFax-Inactive'
       , Destination = 'r00417819@mail.ad.ge.com'
       , UpdatedBy          = SYSTEM_USER
       , UpdatedOn          = CAST(GetDate() AS DATE)
FROM dbo.vReclaimable
WHERE OHR_EmpStatus <> 'A'
  AND vReclaimable.PK = tAccts.PK ;

বিকল্পভাবে, আপনি (সম্ভবত) সহজভাবে ভিউ আপডেট করতে পারেন। এটি কাজ করার জন্য, ভিউটিকে "আপডেটেবল ভিউ" সম্পর্কে সীমাবদ্ধতার সাথে সামঞ্জস্য করতে হবে । : MSDN ডকুমেন্টেশন এ প্রাসঙ্গিক প্যারা দেখুন CREATE VIEW, Updatable দেখেছে :

UPDATE dbo.vReclaimable SET
       Ticket               = 'ARP.ExGE'
       , Method             = 'smtp'
       , AcctOwner          = 'r00417819'
       , DisplayName = '~AppLight HBSFax-Inactive'
       , Destination = 'r00417819@mail.ad.ge.com'
       , UpdatedBy          = SYSTEM_USER
       , UpdatedOn          = CAST(GetDate() AS DATE)

WHERE OHR_EmpStatus <> 'A' ;

2

দেখে মনে হচ্ছে আপনার আপডেট ক্যোয়ারীর টেবিলগুলির মধ্যে আপনার কোনও যোগ নেই।

UPDATE dbo.tAccts SET
       Ticket               = 'ARP.ExGE'
       , Method             = 'smtp'
       , AcctOwner          = 'r00417819'
       , DisplayName = '~AppLight HBSFax-Inactive'
       , Destination = 'r00417819@mail.ad.ge.com'
       , UpdatedBy          = SYSTEM_USER
       , UpdatedOn          = CAST(GetDate() AS DATE)
FROM dbo.vReclaimable
WHERE OHR_EmpStatus <> 'A'

টেবিলের মধ্যে সারি মিলানোর জন্য এখানে অবশ্যই কিছু আছে যেমন tAccts.id = vReclaimable.id


2

এটি রাখার আরেকটি উপায়:

ইস্যুটি আপনার বিশ্বাস যে বিবৃতিটি "টিএসিটিএস টেবিলের কেবলমাত্র সারিগুলি আপডেট করা উচিত যা vRlalamable ভিউ দ্বারা ফিরে আসে"।

বিষয়টি তেমন নয়। এটি সমস্ত সারি আপডেট করে tAccts(ঠিক পরে উল্লিখিত সারণী UPDATE) যা মিলছে OHR_EmpStatus <> 'A'(এর শর্ত WHERE)। এটি করার সময় থেকে এটি ডেটা ব্যবহার করতে পারে vReclaimable(তবে আপনি এটি সম্পর্কে কোনও রেফারেন্স দেন না)।

আপনি যদি এটিতে থাকা সারিগুলিতে সীমাবদ্ধ রাখতে চান vReclaimableতবে উপস্থাপিত অন্যান্য বিকল্পগুলি ছাড়াও, আপনি একটি উপশক্তি ব্যবহার করতে পারেন:

UPDATE dbo.tAccts SET
       Ticket               = 'ARP.ExGE'
       , Method             = 'smtp'
       , AcctOwner          = 'r00417819'
       , DisplayName = '~AppLight HBSFax-Inactive'
       , Destination = 'r00417819@mail.ad.ge.com'
       , UpdatedBy          = SYSTEM_USER
       , UpdatedOn          = CAST(GetDate() AS DATE)
WHERE OHR_EmpStatus <> 'A' AND tAccts.key IN (SELECT key FROM vReclaimable)

0

যদি নীচের ক্যোয়ারী একাধিক সারিতে ফেরত দেয়:

select 'tAccts table', dnis, method, destination, phone_tf, phone_local 
from tAccts
where OHR_EmpStatus <> 'A'

তারপরে আপনি অনন্য সীমাবদ্ধতা লঙ্ঘন করে একই মানগুলির সাথে একাধিক সারি আপডেট করার চেষ্টা করছেন।


এটিও দেখার মতো হতে পারে: স্ট্যাকওভারফ্লো.com
অসীম

0

অন্য বিকল্পটি হ'ল: আপনার দরকার নেই

Dbo.vRlalalable থেকে

কারণ আপনি আপনার আপডেট বিবৃতিতে এই টেবিল থেকে কোনও মান ব্যবহার করেন না।


রেকর্ডের জন্য: এই ক্ষেত্রে, যোগদানের vReclaimableবিষয়টি নিঃসন্দেহে টেবিলটি আপডেট করা ফিল্টার করার উদ্দেশ্যে। যদিও এটির SETধারাটির প্রয়োজন নেই , এটি কার্যকরভাবে WHEREধারাটির অংশ ।
সমস্ত ব্যবসায়ের জন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.