Puncte:4

Puteți dezactiva temporar modificările bazei de date în Microsoft SQL Server?

drapel ru

Într-o actualizare viitoare, va trebui să convertesc mai multe tabele de pe serverul nostru de la UTF-16 la UTF-8. Mă aștept că acest lucru va dura mai multe ore.

Există o modalitate bună de a dezactiva INSERȚII și ACTUALIZĂRI, dar totuși permiteți SELECTAREA în baza de date?

Sau trebuie să blochez modificările la nivel de afaceri / să opresc baza de date în timp ce se realizează actualizarea?

joeqwerty avatar
drapel cv
Puteți pune baza de date în modul numai citire, dar nu am idee ce impact va avea asupra aplicației dvs. și nici dacă asta vă va împiedica să faceți actualizări/modificări.
Sir Swears-a-lot avatar
drapel cw
Ar putea ajuta dacă poți clarifica. 1. Este posibilă/acceptabilă o întrerupere? Daca da pentru cat timp? Cât de mare este db-ul? Câți GB? Câte mese? La câte inserări/actualizări vă așteptați pe oră?
Sir Swears-a-lot avatar
drapel cw
Pe ce versiune de SQL sunteți? Pentru ce colare este setat db-ul tău? Vreți să convertiți literalmente coloanele de coloane? Sau doar treci de la nvarchar la varchar?
Sir Swears-a-lot avatar
drapel cw
De ce treci la UTF8?
drapel cn
@SirSwears-a-lot: UTF8 se potrivește mai bine pentru mulți consumatori de date. Similar cu folosirea datetime2 în loc de datetime. Pentru volume mari de date într-o codificare occidentală tipică, economisește spațiu de stocare, deoarece majoritatea caracterelor sunt reprezentate în doar opt biți. https://techcommunity.microsoft.com/t5/sql-server/introducing-utf-8-support-for-sql-server/ba-p/734928
drapel ru
@SirSwears-a-lot în cazul meu, este pentru că am fost forțat să reproiectez complet ce aplicație citește din baza de date, ceea ce include trecerea de la o bibliotecă care citește/scrie doar utf16 la una care citește/scrie doar utf8.
Puncte:17
drapel cn

S-ar putea să aveți un Problema XY. Există modalități de a face ceea ce încercați, care nu necesită ca tabelele pe care sunt operate să fie indisponibile pentru mutație pe durata operației. Iată cum l-aș schimba (nivel înalt):

  1. Adăugați o nouă coloană cu definiția dorită (tip de date, colare etc.).
  2. Utilizați declanșatoarele „după inserare” pentru a vă asigura că mutațiile de date care provin din aplicația dvs. modifică și noua coloană.
  3. Completați datele existente în tabel.
  4. Aruncă vechea coloană, redenumește noua coloană pentru a avea numele vechii coloane.
Sir Swears-a-lot avatar
drapel cw
Problema XY. Doamne, e frumos. Aproape că am plâns... ;)
Puncte:7
drapel in

Without further knowledge of your database schema, permissions, etc. and some idea of your strategy with respect to your application it is exceedingly difficult to be prescriptive. At a minimum, does the application even allow you to operate in a read-only mode with the table updates blocked?

At a very basic level, "Yes" you can do that... DENY INSERT, UPDATE, DELETE ON <table> TO <user> however it is impossible to say how your application will react. In my experience most applications will splatter errors everywhere and cry bloody murder if you do this, possibly even corrupting the data (unchecked errors, poor use of transactions, etc.). Rarely (possibly never) have I seen an application that gracefully switched to a read-only mode when database access was not as designed/expected.

So TEST! Test, test, test, in a controlled non-production environment until you have a documented process supporting your change.

If your requirements do not allow for an extended outage (or no outage at all) there are more sophisticated ways to handle this. One thought would be to add an after insert / after update trigger to automatically convert new /updated records in a new field while you run maintenance on smaller batches. Once all the data is converted, switch the application to the new field and drop the old one.

dave_thompson_085 avatar
drapel jp
În mod oarecum ironic, Stack în sine de câteva ori pe an face teste sau experimente care fac ca db (relevant) să fie doar citit pentru o perioadă moderată, cum ar fi o jumătate de oră, și din câte am observat (din exterior) o fac destul de curat: există o caseta galbenă vizibilă, dar nu neplăcută, din partea de sus a fiecărei pagini, care anunță starea și elementele de clic care ar necesita scriere sunt dezactivate.
Doug avatar
drapel in
Da, dar magia constă în modul în care o fac. Am văzut multe aplicații în care există un buton de configurare pentru a opri actualizările, cu toate acestea, este doar doar citire la nivelul aplicației, mai degrabă decât baza de date. i.e. aplicația nu mai permite utilizatorilor să schimbe înregistrările, dar de fapt aplicația ar putea încă scrie în baza de date. Un sistem complex (StackExchange) ar avea un comutator sofisticat de numai citire pentru stratul de aplicații. Nu am văzut niciodată, după cum îmi amintesc, o aplicație care a trecut cu grație într-un mod numai citire atunci când se aștepta, dar a refuzat scrierea la nivelul bazei de date.
Puncte:0
drapel cw

Lăsând deoparte UTF-8 și UTF-16, cred că întrebarea mai mare pe care o puneți este cum să implementați modificări la un sistem de producție cu un timp de nefuncționare minim. Sunt sigur că există câteva moduri diferite, dar așa l-aș aborda.

  1. Creați o copie a bazei de date.
  2. Rulați actualizările schemei pe copie.
  3. Utilizați un produs precum Redgate SQL Compare sau scrieți propriile scripturi pentru a vă sincroniza datele. Aduceți-le cât mai aproape
  4. Închideți aplicația, resincronizare finală.
  5. Schimbați conexiunea la baza de date la baza de date nouă (sau redenumiți bazele de date).
  6. Reporniți aplicația.

Știu că acest lucru sună simplist și s-ar putea să nu fie posibil din mai multe motive, dar ar merita investigat.

Aș vrea să fac asta din câteva motive. Întreruperi minime și impact asupra utilizatorilor. Opțiune de revenire în siguranță. O oportunitate de a testa impactul modificărilor schemei/datelor.

Apreciez că acest lucru devine mai complicat dacă există alte aplicații sau conexiuni de integrare la baza ta de date, dar nici să anulezi un upgrade eșuat nu este prea distractiv.

drapel sn
Ce este *"Redgate SQL"*? Face parte din *Redgate Data Tools*? *ReadyRoll Core*? *SQL Prompt Core*? *Căutare SQL*? Altceva?
Sir Swears-a-lot avatar
drapel cw
@PeterMortensen Scuzele mele. „Compararea Redgate SQL” poate fi folosită pentru sincronizarea bazelor de date.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.