Zum Inhalt springen

MS SQL Server 2005 "Direkte Änderungen im Systemkatalog zulassen"


Beagol

Empfohlene Beiträge

Ich such mir hier nen Wolf! ;)

Viel Spass mit deinem Wolf :D

Ich muss dich leider enttaeuschen. Das was du suchst wird nicht mehr unterstuetzt bei, SQL Server 2005.

Informationen findest dazu, wenn du irgendwo unter sp_configure nachschaust.

Die Option die du damit umstellen wolltest nennt sich ansich "allow updates".

Goos

Link zu diesem Kommentar
Auf anderen Seiten teilen

Nuja, die Software wurde wohl fuer den MS SQL Server 2000 geschrieben und darauf sollte sie auch weiterhin aufsetzen.

Ansonsten hat halt eine fehlerhafte Portierung nach SQL Server 2005 stattgefunden und die Software muss noch angepasst werden.

...so seh ich das, auch wenns leicht gesagt ist :D

Goos

Link zu diesem Kommentar
Auf anderen Seiten teilen

Jo, is leicht gesagt ;)

Es handelt sich nicht um ein Script in der Software, sondern ein Script "neben" der Software. Ist wirklich eher Datenbanknah.

Folgendes:

Ich habe eine Datenbank beim Kunden. In dieser Datenbank befinden sich Benutzer. Diese Benutzer sind natürlich auch der SQL Server Engine (ich denke das macht die master DB, oder?) des Kunden bekannt.

Nun mache ich einen Dump. Eine Sicherung. Diese Sicherung nehme ich mit und spiele diese auf eine andere Datenbank auf einem anderen Server.

Die Benutzer bleiben in der DB. Aber die ander SQL Server Engine kennt sie noch nicht.

Nun gibt es also ein Script, welches "verwaiste Benutzer" heißt ;).

Treffend, denn die Benutzer sind in der DB verwaist, da der Server sie nicht kennt.

Das Script korrigiert das und portiert die Benutzer auf den neuen SQL Server.

Das braucht nun diese Adhocänderungen.

Hier das Script:

-- Verwaiste Benutzer.sql


declare @my_name sysname, @my_sid binary(16), @my_passwd sysname

declare cur1 cursor for select name, sid from sysusers where issqluser = 1 and hasdbaccess = 1 and name <> 'dbo'

declare @my_sid2 binary(16), @my_database sysname


set @my_database = db_name()


open cur1

fetch next from cur1 into @my_name, @my_sid

while @@fetch_status = 0

begin

   if (not exists (select * from [master].[dbo].[syslogins] where name = @my_name))

      begin

         set @my_passwd =

           case @my_name

             when 'KW' then 'SYSADM'

             when 'FIBU' then 'SYSADM'

             when 'VERSION' then 'SYSADM'

             when 'SYSADM' then 'SYSADM'

             else 'Passwort'

           end

         exec sp_addlogin @loginame = @my_name, @passwd = @my_passwd, @sid = @my_sid, @defdb = @my_database

         print 'SQL Server Benutzername ' + @my_name + ' erstellt'

      end

   else

      begin

         select @my_sid2 = sid from [master].[dbo].[syslogins] where name = @my_name

         if @my_sid <> @my_sid2

            begin

               begin transaction

                  update sysusers set sid = @my_sid2 where name = @my_name

               commit transaction

               print 'SID von ' + @my_name + ' geaendert'

            end

      end

   fetch next from cur1 into @my_name, @my_sid

end

close cur1

deallocate cur1

Wie kann ich das nun auf SQL Server 2005 anwenden?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dir kann wohl geholfen werden ;)

Das Problem ist ja nur der direkte Zugriff da

update sysusers set sid = @my_sid2 where name = @my_name

Wenn du aber an dieser Stelle nicht manuell die sid aenderst, sondern den Zugriff auf die DB neu erteilst (per sp_revokedbaccess und sp_grantdbaccess), dann wird die sid automatisch vom Login uebernommen und alles passt wieder.

Goos

Link zu diesem Kommentar
Auf anderen Seiten teilen

Nuja, wenn du es folgendermassen machst, dann stimmt die sid wieder mit der des Logins ueberein.

Aber VORSICHT! ...da der Zugriff erneut gewaehrt wurde sind natuerlich die Berechtigungen, welche dem Benutzer vorher in der DB zugeteilt wurden nicht mehr vorhanden ;)

Von daher vermute ich mal, dass es dir so nicht viel nuetzen wird.

Das mit den Berechitgungen waer dann ne Stufe komplizierter.

-- Verwaiste Benutzer.sql


declare @my_name sysname, @my_sid binary(16), @my_passwd sysname

declare cur1 cursor for select name, sid from sysusers where issqluser = 1 and hasdbaccess = 1 and name <> 'dbo'

declare @my_sid2 binary(16), @my_database sysname


set @my_database = db_name()


open cur1

fetch next from cur1 into @my_name, @my_sid

while @@fetch_status = 0

begin

   if (not exists (select * from [master].[dbo].[syslogins] where name = @my_name))

      begin

         set @my_passwd =

           case @my_name

             when 'KW' then 'SYSADM'

             when 'FIBU' then 'SYSADM'

             when 'VERSION' then 'SYSADM'

             when 'SYSADM' then 'SYSADM'

             else 'Passwort'

           end

         exec sp_addlogin @loginame = @my_name, @passwd = @my_passwd, @sid = @my_sid, @defdb = @my_database

         print 'SQL Server Benutzername ' + @my_name + ' erstellt'

      end

   else

      begin

         select @my_sid2 = sid from [master].[dbo].[syslogins] where name = @my_name

         if @my_sid <> @my_sid2

            begin

                  exec sp_revokedbaccess @my_name

	          exec sp_grantdbaccess @my_name

               print 'SID von ' + @my_name + ' geaendert, aber das stimmt nicht wirklich '

            end

      end

   fetch next from cur1 into @my_name, @my_sid

end

close cur1

deallocate cur1[/code]

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das ist nicht gut so ;)

Ich versteh aber auch nicht was du nicht verstehst.

Es ist moeglich, dass der Benutzer zum Beispiel vorher in der DB auf bestimmte Tabellen zugreifen durfte und auf andere Tabelle der DB keinen Zugriff hatte (war einfach mal von jemandem so eingestellt worden... moeglicherweise sogar von dir? )

Diese Zuordnung von Zugriffsberechtigungen ist nach der oben vorgestellten Methode nicht mehr vorhanden.

Goos

Link zu diesem Kommentar
Auf anderen Seiten teilen

Auf einfache Weise kann man das nicht wirklich hinkriegen.

Zu Fuss (bzw. Hand) ists noch recht einfach zu machen, falls die DB nicht kompliziert aufgebaut ist und es nicht viele Rechte zu verteilen gibt.

Es waer aber interessant zu wissen, wieso du das ueberhaupt so machen magst.

Vielleicht bieten sich ja dann irgendwelche komplett anderen Loesungswege an.

Goos

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also Goos,

erstmal herzlichen Dank für Deine Geduld und Hilfe!

Auf einfache Weise kann man das nicht wirklich hinkriegen.

Zu Fuss (bzw. Hand) ists noch recht einfach zu machen, falls die DB nicht kompliziert aufgebaut ist und es nicht viele Rechte zu verteilen gibt.

Nope! Es ist ein Warenwirtschaftssoftware. Hierbei könnten über 100 Benutzer über 500 verschiedene Rechte erhalten.... Schwer das mit der Hand nachzuziehen

Es waer aber interessant zu wissen, wieso du das ueberhaupt so machen magst.

Ich hatte es oben kurz beschrieben

Nun mache ich einen Dump. Eine Sicherung. Diese Sicherung nehme ich mit und spiele diese auf eine andere Datenbank auf einem anderen Server.

Wir machen das, um die Datenbank hier vor Ort zu haben und nicht immer per Fernwartung oder sonstige Leitungen auf die produktive Kunden DB zugreifen zu müssen. Um Lösungswege zu erarbeiten oder z.B. neues Reporting zu erstellen.

Vielleicht bieten sich ja dann irgendwelche komplett anderen Loesungswege an.

Das wäre cool.
Link zu diesem Kommentar
Auf anderen Seiten teilen

Ok, versuchs mal damit:

-- Verwaiste Benutzer.sql


declare @my_name sysname, @my_sid binary(16), @my_passwd sysname

declare cur1 cursor for select name, sid from sysusers where issqluser = 1 and hasdbaccess = 1 and name <> 'dbo'

declare @my_sid2 binary(16), @my_database sysname


set @my_database = db_name()


open cur1

fetch next from cur1 into @my_name, @my_sid

while @@fetch_status = 0

begin

   if (not exists (select * from [master].[dbo].[syslogins] where name = @my_name))

      begin

         set @my_passwd =

           case @my_name

             when 'KW' then 'SYSADM'

             when 'FIBU' then 'SYSADM'

             when 'VERSION' then 'SYSADM'

             when 'SYSADM' then 'SYSADM'

             else 'Passwort'

           end

         exec sp_addlogin @loginame = @my_name, @passwd = @my_passwd, @sid = @my_sid, @defdb = @my_database

         print 'SQL Server Benutzername ' + @my_name + ' erstellt'

      end

   else

      begin

         select @my_sid2 = sid from [master].[dbo].[syslogins] where name = @my_name

         if @my_sid <> @my_sid2

            begin

                 exec sp_change_users_login 'Update_One', @my_name, @my_name

                 print  @my_name + ' gemapt'

            end

      end

   fetch next from cur1 into @my_name, @my_sid

end

close cur1

deallocate cur1

Sollte meiner Meinung nach deine Probleme loesen.

Goos

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...