Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Frage Entwicklung Datenbanken

GELÖST

Primärschlüsselabfrage von MSSQL 2005 auf 2000 (v9 nach v8) portieren ?

Mitglied: Pseumin

Pseumin (Level 1) - Jetzt verbinden

04.08.2008, aktualisiert 05.08.2008, 4703 Aufrufe, 2 Kommentare

Hallo, ich habe ein kleines Problem die untenstehende Abfrage
der Spalten eines Primärschlüssels (MSSQL2005) nach MSSQL 2000 zu portieren.
Die Tabellen sind ganz anders aufgebaut und ich finde da keinen entsprechenden zusammenhang.

01.
select co.name, sc.name from sys.key_constraints co, sys.tables ta, sys.indexes ix, sys.index_columns ic, sys.syscolumns sc  
02.
where ta.object_id = co.Parent_object_id   
03.
and ix.object_id = co.Parent_object_id   
04.
and ic.object_id = co.Parent_object_id   
05.
and sc.id = co.Parent_object_id   
06.
and ix.is_primary_key = 1  
07.
and ix.index_id = ic.index_id   
08.
and sc.colid = ic.index_column_id  
09.
and ta.name = 'tabelle'
Kann mir da mal bitte jemand helfen ?

Danke, Pseumin
Mitglied: Biber
04.08.2008 um 20:56 Uhr
Moin pseumin,

gehen tut ja alles, aber du brauchst eine völlig andere strategie bzw ganz andere SysViews.
die Abfrage oben ist ja nun auch nur von bescheidener Eleganz... wieso Du da über die Sys.Tables gehst, das ist vermutlich eine persönliche Note.

Anyhow, zum allgeneinen Erstaúnen willst Du ja von den PKs die Constraint-Namen haben und das wiederum bezogen auf den Spaltennamen?!?

Frage: Sind PKs bei Dir immer auf eine Spalte bezogen??? *staun*
SQL2000 und vermutlich auch die meisten Laien wie ich würden den PK zwar als eine (benamsbare) constraint bezeichnen, aber keine Ein-Spalten-Constraint, sondern eine Constraint einmalig pro Table.

Entsprechend ist auch in SQL2000 und früher die Tabelle sysconstraints, die Du eventuell mal angeschaut hast eine Sackgasse. PKs stehen da nicht auf eine colId bezogen drin wie in der SQl2005-Query drin, wäre ja auch vollkommen absurd.

IMHO musst Du ohnehin über sysusers + sysobjects + sysindexes + sysreferences gehen.

Aber wenn Du "nur" den PK-Constraint einer Dir namentlich bekannten Tabelle ermitteln willst und meine Theorie stimmt, dass ein PK einmalig je Tabelle dort abgelegt wird, dann müsste ein superbilliges Dünnbrett-Statement reichen:
01.
SELECT object_name(id), object_name(constid) from sysconstraints  
02.
where objectname = 'tabelle'  
03.
and (Status & 1 )=1 and ColId = 0

Wenn Du sicher(er) gehen willst, eine gültige PK-Constraint zu erwischen, dann solltest Du noch die ID mit der sysobjects verjoinen und dort die Felder Category und ColId in die Where-Bedingung aufnehmen.

Die Spalte sysobjects.Category muss das Bit 512 gesetzt haben.
Und Spalte sysconstraints.colId muss gleich 0 sein.

Also skizziert:
01.
SELECT object_name(o.id), object_name(sc.constid)  
02.
from sysconstraints sc, sysobjects o 
03.
where o.id = sc.id and 
04.
(sc.Status & 1) = 1 and 
05.
(o.category & 512) = 0 and sc.colid = 0
Aber ich verstehe nicht, was Du mit nur dem tabellennamen und dem Constraintnamen des PKs anfangen willst.
Brauchst Du nicht die Felder des PK und die Reihenfolge?
Dann nusst Du doch ohnehin über die Sysindexes und sysreferences.
Wie willst Du denn einen PK-Constraintnamen ändern, wenn ein oder zwei Felder des PK zufällig auch FK-Spalten sind.

Für eine Erläuterung des Plans bzw. des anwendungsfalls wäre ich dankbar - ich versuche gerade, mir ein wenig SQL anzueignen....

Grüße
Biber
Bitte warten ..
Mitglied: Pseumin
05.08.2008 um 08:36 Uhr
Hi Biber,
danke für die Ausführungen.

Ich bin kein hauptberuflicher Datenbankprogrammierer und mit den Systemtabellen habe ich mich bisher eigentlich überhaupt nicht beschäftigt (den Ansatz für diese Lösung habe ich in einen anderen Forum gefunden), aber unser System nutzt halt eine Datenbank. Diese DB entwickelt sich seit ca. 15 Jahren mit unserem System fortlaufend weiter (dadurch ist der DB-Aufbau inzwischen auch unter aller Sau ).
Für einen Spezialfall brauchte ich jetzt für eine Tabelle Funktionen, die automatisch bei allen Kunden überprüft, ob der Primärschlüssel
schon das neue Format (3 Spalten) besitzt, oder ob er noch aus 2 Spalten besteht.

>Anyhow, zum allgeneinen Erstaúnen willst Du ja von den PKs die Constraint-Namen haben und
>das wiederum bezogen auf den Spaltennamen?!?

Ja, ne. In dem Ergebnis ist halt in der 1. Spalte der Constraint-Name enthalten (zwar n Mal, da n Spalten, aber egal).
In der 2. Spalte ist dann der Spaltenname enthalten, also für einen Primärschlüssel mit 3 Spalten bekomme ich 3 Zeilen zurück. Reihenfolge ist in unserem Fall derzeit unwichtig und daher nicht erforderlich.

Die Spaltennamen brauche ich, um den derzeitigen Primärschlüssel auf gültigkeit zu überprüfen.
Den Constraint-Namen brauche ich, um den Primärschlüssel eventuell löschen zu können.

Folgender Ablauf also bei uns:
Ist der Ist-Primärschlüssel <> Soll-Primärschlüssel, dann lösche Alt-Primärschlüssel und lege Neu-Primärschlüssel an (zuvor Nullwerte eliminieren und Spalte auf "NOT NULL" setzen).

Ok, die Reihefolge wird so nicht berücksichtigt, ist in unserem Fall aber egal. Tiefere Zusammenhänge (ich glaube, mit
Fremdschlüsseln kann es beim löschen noch Probleme geben) gibt es bei uns auch nicht. Daher : "Egal."

Ich habe gestern Abend übrigen auch noch eine Lösung für v8 gefunden (die Lösung für v9 behalte ich so bei weils einfach funktioniert):
01.
SELECT CONSTRAINT_NAME PKeyName, COLUMN_NAME ColumnName FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE  
02.
where Constraint_name in ( 
03.
   select name from sysobjects 
04.
   where parent_Obj  in (  
05.
      select id from sysobjects 
06.
      where name like 'Tabelle' 
07.
   and xtype = 'PK'
Bitte warten ..
Ähnliche Inhalte
Datenbanken
MsSQL 2005 zu MsSQL 2014 Servernamen ändern?
gelöst Frage von SPSmanDatenbanken21 Kommentare

Hallo, ich habe folgendes Problem: ein Kollege von mir ist mit meinem "alten System" mit MSSQL Server 2005 nach ...

Windows Installation
Pervasive V8
Frage von sascha7412Windows Installation1 Kommentar

Hallo Ich würde für eine alte Warenwirtschaftsoftware, die Software Pervasive V8 benötigen. Hat diese Software noch jemand und könnte ...

Assembler
Assembler-Routine portieren: x86 auf x64
gelöst Frage von AnkhMorporkAssembler4 Kommentare

Hallo in die Runde, ich habe eine Verständnisfrage. Habe folgende Assembler-Routine erstellt: Programmier-Umgebung: Lazarus-Pascal 1.2.4. mit fpc 2.6.4 Ist ...

PHP
PHP 5.3 nach PHP 5.6 portieren
Frage von nippon-tussiPHP5 Kommentare

Ich habe hier ein altes Projekt, das seit Jahren unter php 5.3 auf einem shared host bei all-inkl läuft. ...

Neue Wissensbeiträge
Linux

Meltdown und Spectre: Linux Update

Information von Frank vor 14 StundenLinux

Meltdown (Variante 3 des Prozessorfehlers) Der Kernel 4.14.13 mit den Page-Table-Isolation-Code (PTI) ist nun für Fedora freigegeben worden. Er ...

Tipps & Tricks

Solutio Charly Updater Fehlermeldung: Das Abgleichen der Dateien in -Pfad- mit dem Datenobject ist fehlgeschlagen

Tipp von StefanKittel vor 1 TagTipps & Tricks

Hallo, hier einmal als Tipp für alle unter Euch die mit der Zahnarztabrechnungssoftware Charly von Solutio zu tun haben. ...

Sicherheit

Meltdown und Spectre: Wir brauchen eine "Abwrackprämie", die die CPU-Hersteller bezahlen

Information von Frank vor 1 TagSicherheit12 Kommentare

Zum aktuellen Thema Meltdown und Spectre: Ich wünsche mir von den CPU-Herstellern wie Intel, AMD oder ARM eine Art ...

Sicherheit

Meltdown und Spectre: Realitätscheck

Information von Frank vor 1 TagSicherheit9 Kommentare

Die unangenehme Realität Der Prozessorfehler mit seinen Varianten Meltdown und Spectre ist seit Juni 2017 bekannt. Trotzdem sind immer ...

Heiß diskutierte Inhalte
Sicherheit
Meltdown und Spectre: Die machen uns alle was vor
Information von FrankSicherheit25 Kommentare

Aktuell sieht es in den Medien so aus, als hätten die Hersteller wie Intel, Microsoft und Co den aktuellen ...

Netzwerke
Packet loss bei "InternetLeitungsvollauslastung"
gelöst Frage von Freak-On-SiliconNetzwerke17 Kommentare

Servus; Ja der Titel klingt komisch, is aber so. Wenn die Internetleitung voll ausgelastet ist, hab ich extreme packet ...

Ubuntu
Ubuntu - Starter für nicht vertrauenswürdige Anwendungen
Frage von adm2015Ubuntu17 Kommentare

Hallo zusammen, Ich verwende derzeit die Ubuntu Versionen 17.10 bzw. im Test 18.04. Ich habe mehrere .desktop Dateien in ...

Windows 10
Automatische daten kopieren, USB zu USB unter Win10 im Hintergrund
Frage von DerEisigeWindows 1016 Kommentare

Hallo Leute, ich bin auf der Suche nach einem Skript, dass von einem USB Stick automatisch nach dem einstecken ...