Sub Sa(Of Control)

Differential pathogenicity of Trypanosoma congolense subgroups : Implicaiton for the strategic control of trypanosomosis
Thématique : Organismes nuisibles des animaux
Article de revue
Agents Cirad, auteurs de cette publication :
(C) Cirad 2011CONTROL SERVER vs. sysadmin/sa: permissions, system procedures, DBCC, automatic schema creation and privilege escalation - caveatsCONTROL SERVER gegen Sysadmin/sa: Berechtigungen, Systemprozeduren, DBCC, automatische Schema-Erstellung und Privilegienausweitung - Fallstricke
Seit SQL Server 2005 gibt es die Serverweite Berechtigung CONTROL SERVER. Prinzipiell eine Alternative zur sysadmin-Mitgliedschaft, blieb sie dennoch nicht viel mehr als ein Ladenhüter – kaum bekannt und noch weniger verwendet.
Einer der Hauptgründe dafür war die fehlende M?glichkeit, dieses Recht einer Gruppe von Prinzipalen/Logins auf Server-Ebene zu geben.
Seit SQL Server 2012 ist es ja nun m?glich, eigene Server-Rollen zu definieren, so dass diese Berechtigung nun immer mehr Verwendung findet.
Dennoch ist sie kein vollst?ndiger Ersatz für sysadmin. Warum das so ist wo die Unterschiede liegen und wo es sogar ein Risiko sein kann, m?chte ich im Folgenden für meine Leser festhalten und demonstrieren.
Since SQL Server 2005, the server wide permission CONTROL SERVER has been existing. In principle being an alternative to sysadmin-membership, it did not turn out to be much more than a shelf warmer. - Little known and even less used.
One of the main reasons for this was the absence of an option to grant this permission to a group of principals/Logins on server-level.
Since SQL Server 2012, it has been possible to define custom server-roles, so now this permission is used more and more.
However, it is no complete replacement for sysadmin. In the following, I want to demonstrate to my readers exactly why this is, where the differences are and where it can even be a risk.
Grundlegende Kenntnisse über das Verhalten von sysadmin und dbo setze ich als hinreichend bekannt voraus, und konzentriere mich auf das, was bei der Verwendung von CONTROL SERVER anders ist.
I will take as a given basic knowledge about the behavior of sysadmin and dbo and therefore focus on the things that are different when using CONTROL SERVER.
Zun?chst wird ein neuer Login, ,,DBA_TheDude“, angelegt – das Passwort natürlich streng meinen Richtlinien (für Blogs) entsprechend. ;-)
Es folgen eine neue Serverrolle, ,,Role_DBA“, in die der Login als Mitglied aufgenommen wird.
Und da diese Rolle für Administratoren gedacht ist, erh?lt sie die weitest-m?glichen Rechte: CONTROL SERVER.
First of all, a new Login, ,,DBA_TheDude“, is created – the password of course adhering strongly to my rules (for blogs). ;-)
This is followed by a new server role “Role_DBA” to which the Login will be added as a member.
And since this role is meant for administrators, it receives the most extensive permission: CONTROL SERVER.
USE [master]GO
CREATE LOGIN DBA_TheDude WITH PASSWORD=N'www', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFFGO
CREATE SERVER ROLE [Role_DBA]
ALTER SERVER ROLE [Role_DBA] ADD MEMBER DBA_TheDude
GRANT CONTROL SERVER TO [Role_DBA]GO
CREATE DATABASE ControlServer_Schema_DemoGO
Als n?chstes melden wir uns als DBA am System an und lassen uns ,,die (effektiven) Rechte verlesen“ :-)
Next we log onto the system as DBA and have "our (effective) rights" displayed. :-)
EXECUTE AS LOGIN = 'DBA_TheDude'
SELECT entity_name, permission_nameFROM sys.fn_my_permissions(NULL, NULL)entity_name
entity_name
permission_name
CONNECT SQL
CREATE ENDPOINT
CREATE ANY DATABASE
CREATE AVAILABILITY GROUP
ALTER ANY LOGIN
ALTER ANY CREDENTIAL
ALTER ANY ENDPOINT
ALTER ANY LINKED SERVER
ALTER ANY CONNECTION
ALTER ANY DATABASE
ALTER RESOURCES
ALTER SETTINGS
ALTER TRACE
ALTER ANY AVAILABILITY GROUP
ADMINISTER BULK OPERATIONS
AUTHENTICATE SERVER
EXTERNAL ACCESS ASSEMBLY
VIEW ANY DATABASE
VIEW ANY DEFINITION
VIEW SERVER STATE
CREATE DDL EVENT NOTIFICATION
CREATE TRACE EVENT NOTIFICATION
ALTER ANY EVENT NOTIFICATION
ALTER SERVER STATE
UNSAFE ASSEMBLY
ALTER ANY SERVER AUDIT
CREATE SERVER ROLE
ALTER ANY SERVER ROLE
ALTER ANY EVENT SESSION
CONTROL SERVER
Klingt gut. Scheint Nichts zu fehlen.Oder doch?
Vergleichen wir es mal mit der Liste aller Rechte, die es auf Server-Ebene überhaupt gibt:
Sounds good. Nothing seems to be missing at first glance.Or does it?
Let’s compare it to the list of all permissions which exist on server-scope:
SELECT class_desc COLLATE Latin1_General_CI_AI, permission_name COLLATE Latin1_General_CI_AIFROM sys.fn_builtin_permissions('SERVER')EXCEPTSELECT entity_name, permission_nameFROM sys.fn_my_permissions(NULL, NULL)
(0 row(s) affected)
Ok, also wir haben wirklich alle Rechte, die man (auf Serverebene) vergeben kann.Das ist auch dokumentiert: und hier:
Diese Berechtigungen und Kommandos funktionieren auch wie dokumentiert.
Wie sieht es aber mit gespeicherten Systemprozeduren aus?
Ok, we really do have all permissions which can be granted (at server scope).This is also documented: and here:
Those permissions and commands really do work as documented.
But how about system stored procedures?
exec sp_readerrorlog
Msg 15003, Level 16, State 1, Procedure sp_readerrorlog, Line 11Only members of the securityadmin role can execute this stored procedure.
Warum das jetzt?
Ganz einfach. Sicher ist es den meisten noch gut aus SQL Server 2000-Zeiten bekannt, dass sicherheitskritische Systemprozeduren einen Check auf Mitgliedschaft in bestimmten Rollen enthalten. Und das tun die meisten derer auch heute noch. Ein Artefakt der damaligen unflexiblen Rechte-Verwaltung, kann man sagen.
Wenn man in den Code der sp_readerrorlog schaut, wird es dort genau so gemacht:
Why ist that now?
Quite simple. Most do probably remember from SQL 2000 times, that security wise critical system procedures include a check for membership in certain roles. And most of them still do the same today. One can call it an artefact of the then inflexible permission-management.
When we look into the code of sp_readerrorlog, this is what is being done there as well:
if (not is_srvrolemember(N'securityadmin') = 1) begin
raiserror(15003,-1,-1, N'securityadmin' return (1) end
exec sys.xp_readerrorlog...
Okay.Natürlich k?nnten wir diesen Code umgehen und die xp_readerrorlog direkt aufrufen.
In der GUI-Anzeige im Management Studio hilft uns das nicht, wir k?nnen es als manuellen Workaround verwenden.
Weitere Systemprozeduren, die über SSMS aufgerufen werden und die Ausführung verweigern sind unter anderem:sp_addumpdevice - für Backup-Devicessp_enum_oledb_providers – wird beim Konfigurieren und Betrachten von Linked Servers verwendet.
sp_addlinkedserver l?sst sich dafür ohne Probleme ausführen – nur eben nicht über die GUI wegen eben genannter Prozedur.
Die Einrichtung von Database-Mail über die GUI bleibt ebenfalls den sysadmins vorbehalten. Via Script sollte es jedoch funktionieren (ungetestet).
Auch die Konfiguration des Distributors für die Replikation mittels sp_adddistributor ist ohne den sysadmin-Bit nicht m?glich.Andere Replikationskonfigurationsaufgaben sind teilweise sogar über die GUI m?glich.
Unter SQL Server 2005 – 2008R2 gibt es für das Hinzufügen/Entfernen von (Server-)Rollenmitgliedern nur die Prozedur sp_addsrvrolemember / sp_dropsrvrolemember. Diese führt ebenfalls eine Serverrollen-Mitgliedschafts-Prüfung durch. - Unter SQL Server 2012 ist diese Prozedur aus Rückw?rtskompatibilit?tsgründen noch vorhanden, jedoch wurde dieser Check aus dem Code entfernt. Damit verh?lt sie sich in dieser Hinsicht somit wie der direkte Aufruf von ALTER SERVER ROLE {RoleName} ADD MEMBER {Loginname}.
Das gleiche gilt für sp_addrolemember / sp_droprolemember für Datenbankrollen.
Okay.Of course we can go round this code by calling xp_readerrorlog directly.
This does not help in the GUI-presentation in Management Studio but we can use it as a manual workaround.
Among other system procedures that are called via SSMS and refuse execution are:sp_addumpdevice - for backup-devicessp_enum_oledb_providers – is used for viewing and configuring Linked Servers.
sp_addlinkedserver on the other hand can be executed without problems – just not via the GUI because of the just mentioned procedure.
Setting up Database-Mail via the GUI is also reserved for sysadmins. It should work via script though (untested).
Also the configuration of the distributor for replication by means of sp_adddistributor is not possible without the sysadmin bit.Other replication tasks are partially possible even via the GUI.
Under SQL Server 2005 – 2008R2, to add/remove (server) role members, solely the system procedure sp_addsrvrolemember / sp_dropsrvrolemember exists. This one also conducts a server-role-membership-check. - Under SQL Server 2012 this procedure still exists for backwards-compatibility reasons, but this specific check has been removed from the code. Thereby it now behaves like the direct call of ALTER SERVER ROLE {RoleName} ADD MEMBER {Loginname}.
Same applies to sp_addrolemember / sp_droprolemember for database roles.
Soweit zu Systemprozeduren. Eigentlich ziemlich simpel, wenn man die Hintergründe kennt.
Daher, wo m?glich: DDL-Kommandos verwenden, wie seit SQL Server 2005 nahegelegt wird.
Randnotiz: Es gibt mindestens 7 Variationen der Prüfung auf sysadmin-Mitgliedschaft. :-) :-(
Eine Kostprobe:
So much for system stored procedures. Quite simple after all, if you know the background.
Therefore, wherever possible: use DDL-commands, as it is advised since SQL Server 2005.
Side-note: there are at least 7 variations for the check of sysadmin-membership. :-) :-(
IF IS_SRVROLEMEMBER('sysadmin') != 1IF is_srvrolemember('securityadmin') = 0IF (is_srvrolemember('sysadmin') && 1)IF (is_srvrolemember(N'sysadmin') && 1 )IF (not is_srvrolemember(N'sysadmin') = 1)IF (ISNULL(IS_SRVROLEMEMBER('sysadmin'),0) = 0)IF isnull(is_srvrolemember('sysadmin'),0) = 1
Die h?ufigsten Fehlermeldungen, die dann ggfls. ausgel?st werden, sind:
The most frequent error messages which are triggered if applicable are:
message_id
You do not have the required permissions to complete the operation.
You do not have sufficient permission to run this command. Contact your system administrator.
Only members of the %s role can execute this stored procedure.
User does not have permission to perform this action.
Only members of the sysadmin fixed server role can perform this operation.
Caller is not authorized to initiate the requested action. DBO privileges are required.
message_id
Sie haben nicht die erforderlichen Berechtigungen, um den Vorgang abzuschliessen.
Sie haben nicht die erforderliche Berechtigung, um diesen Befehl auszuführen. Wenden Sie sich an den Systemadministrator.
Nur Mitglieder der %1!-Rolle k?nnen diese gespeicherte Prozedur ausführen.
Der Benutzer besitzt nicht die Berechtigung zum Ausführen dieser Aktion.
Nur Mitglieder der festen Serverrolle 'sysadmin' k?nnen diesen Vorgang ausführen.
Der Aufrufer ist nicht zum Initiieren der angeforderten Aktion berechtigt. Es sind DBO-Privilegien erforderlich.
Eine vollst?ndige Liste aller Prozeduren, die auf sysadmin-Rollenmitgliedschaft prüfen, folgt am Ende.
A complete list of procedures that check for sysadmin-membership is included at the end of this post.
Kommen wir zu einem anderen wichtigen Bereich:
DBCC-Kommandos
Let’s come to another important area:
DBCC commands
DBCC CHECKDB
Msg 7983, Level 14, State 36, Line 1User 'public' does not have permission to run DBCC checkdb for database 'master'.
Das geht ja gut los.
Die ,,Regel“ ist bei DBCC noch einfacher:Fast jedes DBCC-Kommando prüft auf sysadmin.
Von DBCC CHECKDB über DBCC LOGINFO bis zu DBCC TRACEON. Also auch durchaus wertvolle Kommandos auch für den externen Support.- Tats?chlich ist selbst DBCC HELP nur für sysadmins zugelassen...
Die einzigen Ausnahmen, die mir bekannt sind:DBCC SHOW_STATISTICS
man muss jedoch mindestens ddl_admin oder Besitzer der Tabelle sein
DBCC DETACHDB
das ist ein spezieller Fall, da es über sp_detach_db ausgeführt wird
db_owner oder dbo der datenbank ist ausreichend
DBCC FREEPROCCACHE und DBCC SQLPERF
Diese setzen lediglich die ALTER SERVER STATE Berechtigung voraus.
DBCC DROPCLEANBUFFERS wiederum setzt die sysadmin-Rollenmitgliedschaft voraus.
Diese Berechtigungen sind übrigens recht gut dokumentiert.
That’s a good start, isn’t it..
The ,,rule“ for DBCC is even simpler:Almost every DBCC-command checks for sysadmin.
From DBCC CHECKDB via DBCC LOGINFO to DBCC TRACEON. Thus some quite valuable commands also for external support.- In fact even DBCC HELP is only allowed for sysadmins...
The only exceptions known to me are:DBCC SHOW_STATISTICS
one needs to be at least ddl_admin or owner of the table
DBCC DETACHDB
this is a special case, since it's executed via sp_detach_db
db_owner or dbo of the database is sufficient
DBCC FREEPROCCACHE and DBCC SQLPERF
Those require only the ALTER SERVER STATE permission.
DBCC DROPCLEANBUFFERS on the other hand requires sysadmin-role membership.
Those permissions are documented quite well by the way.
Datenbankberechtigungen
Mit CONTROL SERVER hat ein Prinzipal auch vollen Zugriff auf alle Datenbanken.Fast, aber auch nur fast wie sysadmins, die bekanntlich auf den ,,dbo“ gemappt werden.
Logins mit lediglich CONTROL SERVER-Berechtigung werden nicht(!) zu dbo gemapped.
Welche Auswirkungen das hat, sieht man im Folgenden:
Database permissions
With CONTROL SERVER, a principal has full access to all databases.Almost, but only almost like sysadmins, which are, as is well-known, mapped to “dbo”.
Logins with merely CONTROL SERVER permission are not(!) mapped to dbo.
The consequences of this can be seen in the following:
USE ControlServer_Schema_DemoGO
SELECT USER_NAME()
DBA_TheDude
CREATE TABLE dbo.DemoTable1_dbo(id int)GO
CREATE TABLE DemoTable2_NoSchemaSpecified(id int)GO
SELECT name, schema_id FROM sys.tablesSELECT * FROM sys.schemas
Was ist passiert?
Erinnern Sie sich noch an das pre-SQL 2012 Problem, das man Windows-Gruppen kein Default Schema zuweisen konnte? Und was passierte, wenn ein Entwickler über solch eine Gruppe vergass, beim Anlegen eines Objektes das Schema anzugeben?
Richtig. Das ist genau das gleiche: es wurde ein Schema mit dem Login-Namen des Entwicklern angelegt. Eine reine Freude für sp?tere Aufr?umarbeiten, die ,,richtigen falschen“ Schemas zu identifizieren und zu l?schen.Dieses Issue (eines der am h?chsten votierten ) wurde mit SQL Server 2012 ja gel?st.
Leider wurde dabei verpasst, auch die Behandlung von CONTROL SERVER Berechtigten anzupassen. Dazu hatte ich ebenfalls ein Connect-Item erstellt.: ,,”. - Leider zu sp?t. :-/
Vermutlich wird dazu ein identischer Code-Block verwendet, denn genau wie in dem Windows-Gruppen-Szenario ist dieses implizite Anlegen des Schemas nicht abfangbar.
Fazit: Immer ein Schema angeben, wenn man als CONTROL Server Berechtigter Objekte anlegt – am besten einfach wirklich immer ein Schema angeben (es gibt noch andere Gründe dafür).
What happened?
Do you remember the pre-SQL 2012 problem, that windows groups could not be assigned a default schema? And what happened if a developer forgot to specify a schema when creating an object?
Right. This is exactly the same: a schema with the Login-Name of the developer has been created. A true joy for later clean-up, to identify and drop the ,,right wrong” schemas.This Issue (one of the most voted ) has been resolved with SQL Server 2012.
Unfortunately the handling of the CONTROL SERVER permission has been overlooked to be fixed. I did create a connect item: ,,”. – Unfortunately too late. :-/
Probably an identical code-block is being used for that, since just like in the Windows-Group scenario, this implicit creation of the schema is uncatchable.
Conclusion: Always specify a schema when creating an object as a CONTROL SERVER granted principal – best: always specify a schema. (there are other reasons for that, too)
Privilege-Escalation-Risiko:
Abschliessen m?chte ich mit einem sicherheitstechnisch extrem wichtigen Hinweis:
Logins mit CONTROL SERVER Berechtigung k?nnen standardm?ssig JEDEN Login impersonifizieren. JEDEN. Also auch alle Sysadmins und sa selber! – Und auch wenn SQL Authentifizierung nicht aktiv ist!
Und so l?sst sich das wunderbar ausnutzen:
Privilege-Escalation-risc:
I want to wind up with a security-wise extremely important hint:
Logins with CONTROL SERVER permission can impersonate EVERY Login. ALL OF THEM. Thus also all sysadmins and sa itself! – And even if SQL authentication is not active!
And this is how this can be exploited marvellously:
ALTER SERVER ROLE sysadmin ADD MEMBER DBA_TheDude
EXEC sp_addsrvrolemember'DBA_TheDude', 'sysadmin';
EXECUTE AS LOGIN = 'sa';
ALTER SERVER ROLE sysadmin ADD MEMBER DBA_TheDude
--& “Thank you”
Wer sich also gegenüber dieser Form von Privilege-Escalation schützen m?chte, muss das impersonate (mithilfe von DENY) verbieten. - Und warum sollte man das nicht wollen, würde es doch ggfl. das gesamte Konzept von CONTROL SERVER in Frage stellen (?! ) - Denn das ist der finale und entscheidende Unterschied:
Sysadmin-Mitglieder k?nnen nicht mit DENY eingeschr?nkt werden. Prinzipale mit blosser CONTROL SERVER Berechtigung jedoch schon.
So funktionieren alle reinen DDL/DML Kommando-Berechtigungen eben.
Also, um es noch einmal klar zu sagen, da es so entscheidend ist:Ein Login mit CONTROL SERVER Recht macht nur dann Sinn, wenn ihm gleichzeitig verboten wird, andere sysadmins (oder am besten: alle Logins) zu impersonifizieren. Andernfalls kann man ihn gleich zum sysadmin machen!
Dummerweise geht das nur über "DENY IMPERSONATE ON LOGIN::[Loginname]". Denn IMPERSONATE ist hierarchisch direkt CONTROL SERVER untergeordnet!
Who wants to protect himself from this form of privilege escalation must DENY impersonating.- And why would you not want to do that since this eventually would put the whole concept of CONTROL SERVER in question (?!) -Because this is the final and crucial difference:
Sysadmin-members cannot be restricted anything via DENY. Principals with mere CONTROL SERVER permissions yet can.
This is how all plain DDL/DML commands work.
So, to say it clearly again, because this is vital:A Login with CONTROL SERVER Permission only makes sense, when at the same time it is explicitely denied impersonation of any sysadmin (or better: any Logins). Otherwise you may as well just make him sysadmin right away!
Unfortunately this only works via "DENY IMPERSONATE ON LOGIN::[Loginname]". This is because IMPERSONATE is hierarchically a direct subordinate of CONTROL SERVER!
USE master
DENY IMPERSONATE ON LOGIN::sa TO [DBA_TheDude]
Bei einer sich ?ndernden Liste an Systemadministratoren hat man ein Problem, wenn man nicht an dieses Deny denkt! (N?chstes Risiko!)
- Sp?testens an dieser Stelle sollte man sich mit dem ?berwachungs-Feature von SQL Server befassen.
For a changing list of system administrators one has a real problem, in case of not remembering this crucial Deny! (Next risk!)
- At the latest at this point one should address the Auditing feature of SQL Server.
Mein Fazit und Lessons-learned daher:
CONTROL-SERVER selber ist eine konsequente Fortführung der Bemühungen des Sicherheits-Teams, SQL Server sicherheitstechnisch noch einfacher und damit robuster zu machen.
Jedoch ist aus dem Grund der Impersonate-Rechte eine Privilege Escalation zu sysadmin sehr einfach. Um diese zu verhindern, sollte man gut mit der Berechtigungs-Hierarchie von SQL Server vertraut sein. – Wie immer: ,,Wissen schafft Sicherheit.“
Was wirklich schmerzt, ist, das eines der besten Anwendungsszenarien: Rechte für Support-Personal, intern oder Extern.Das Fehlen der M?glichkeit, DBCC-Kommandos direkt zu berechtigen, macht uns hier einen Strich durch die Rechnung. Wenn man nicht jedes wichtige DBCC-Kommando in eine eigene Prozedur wrappen und somit berechtigen m?chte, führt am sysadmin in diesen Anwendungsf?llen nichts vorbei. (!)
Im Endeffekt ist eine strikte ,,Separation of Duties“, die Funktionstrennung auf verschiedene ,,Rollen“ das eherne Ziel.
Hier kann man dazu Nachlesen – auch das ,,SQL Server Separation of Duties Framework“ von codeplex, mit vielen guten Ideen kann ich empfehlen einmal anzusehen:
My conclusion and lessions-learned therefore are:
CONTROL SERVER itself is a consistent continuation of the efforts of the security team to make SQL Server even simpler and thereby more robust.
Because of the impersonate-permissions, a privilege escalation is really simple. In order to prevent this, one should be familiar with the permission hierarchy of SQL Server. – As always: “Knowledge leads to security.”
What really does hurt, is one of the best application cases: Permissions for support-personnel, internal or external.The missing possibility to grant permissions to DBCC directy throws a monkey wrench in our plans. If one does not want to create a procedure as wrapper for every important DBCC command, there is no way around sysadmin in those scenarios. (!)
In the end, a strict “separation of duties” is the iron goal.
Here you can read more about it – you should also check out the “SQL Server Separation of Duties Framework” on codeplex with many good ideas:
Update 04-2014:
Mit SQL Server 2014 wird CONTROL Server etwas sicherer. Hier kann man mehr zu den neuen M?glichkeiten lesen:
Update 04-2014:
With SQL Server 2014 CONTROL Server becomes a bit safer. You can read more on the new possibilities here:
Eine Abl?sung des ,,sa" ist übrigens nicht geplant, jedoch sinkt mit jedem Release die Anzahl der Szenarien, wo sa/sysadmin zwingend ben?tigt wird.
A displacement of ,,sa“ is not planned by the way, but with every release the scenarios where sa/sysadmin is imperatively needed become less.
Happy securing,
Anbei die komplette Liste aller Systemprozeduren unter SQL Server 2012, die auf sysadmin-Rollenmitgliedschaft prüfen (171 – gegenüber 173 unter SQL Server 2008R2. SQL Server 2014 CTP1 ist noch das Gleiche):
(Hinweis: Insgesamt 197 Systemprozeduren prüfen auf Serverrollenmitgliedschaft, wie diskadmin oder serveradmin usw.)
Enclosed the list of all system procedures under SQL Server 2012 that check for sysadmin-role membership (171 – vs. 171 under SQL server 2008. SQL Server 2014 CTP 1 still the same):
(Hint: Altogether 197 system procedures check for server role membership like diskadmin or serveradmin and so on)
Module_Name
fn_yukonsecuritymodelrequired
sp_add_agent_parameter
sp_add_agent_profile
sp_adddatatype
sp_adddistributiondb
sp_adddistributor
sp_addqreader_agent
sp_addsubscriber
sp_addsubscriber_schedule
sp_addtabletocontents
sp_attachsubscription
sp_cdc_cleanup_change_table
sp_cdc_disable_db
sp_cdc_disable_table
sp_cdc_drop_job
sp_cdc_enable_db
sp_cdc_enable_table
sp_cdc_restoredb
sp_cdc_vupgrade
sp_certify_removable
sp_change_agent_parameter
sp_change_agent_profile
sp_change_subscription_properties
sp_change_users_login
sp_changedistpublisher
sp_changedistributiondb
sp_changedistributor_password
sp_changedistributor_property
sp_changemergesubscription
sp_changeqreader_agent
sp_changereplicationserverpasswords
sp_changesubscriptiondtsinfo
sp_checkinvalidivarticle
sp_copysubscription
sp_create_removable
sp_cycle_errorlog
sp_dbcmptlevel
sp_dbmmonitoraddmonitoring
sp_dbmmonitorchangealert
sp_dbmmonitordropalert
sp_dbmmonitordropmonitoring
sp_dbmmonitorhelpalert
sp_dbmmonitorhelpmonitoring
sp_dbmmonitorresults
sp_dbmmonitorupdate
sp_dbremove
sp_drop_agent_parameter
sp_drop_agent_profile
sp_dropdatatypemapping
sp_dropdistpublisher
sp_dropdistributiondb
sp_dropdistributor
sp_dropmergepullsubscription
sp_droppullsubscription
sp_dropsubscriber
sp_dsninfo
sp_enumdsn
sp_flush_commit_table_on_demand
sp_generate_agent_parameter
sp_get_distributor
sp_get_Oracle_publisher_metadata
sp_getagentparameterlist
sp_getdefaultdatatypemapping
sp_grant_publication_access
sp_help_agent_default
sp_help_agent_parameter
sp_help_agent_profile
sp_helpdistpublisher
sp_helpdistributor
sp_helpmergesubscription
sp_helpqreader_agent
sp_helpreplicationdboption
sp_identitycolumnforreplication
sp_IHValidateRowFilter
sp_IHXactSetJob
sp_link_publication
sp_monitor
sp_MSadd_distribution_agent
sp_MSadd_logreader_agent
sp_MSadd_merge_agent
sp_MSadd_snapshot_agent
sp_MSadd_subscriber_schedule
sp_MSadd_tracer_history
sp_MSadd_tracer_token
sp_MScdc_cleanup_job
sp_MScdc_db_ddl_event
sp_MScdc_ddl_event
sp_MSchange_distribution_agent_properties
sp_MSchange_logreader_agent_properties
sp_MSchange_merge_agent_properties
sp_MSchange_snapshot_agent_properties
sp_MSchangedynamicsnapshotjobatdistributor
sp_MSchangedynsnaplocationatdistributor
sp_MScheck_pull_access
sp_MScleanupmergepublisher_internal
sp_MSclear_dynamic_snapshot_location
sp_MScreate_dist_tables
sp_MSdbuserpriv
sp_MSdeletefoldercontents
sp_MSdrop_6x_replication_agent
sp_MSdrop_merge_agent
sp_MSdrop_snapshot_dirs
sp_MSdropmergedynamicsnapshotjob
sp_MSdynamicsnapshotjobexistsatdistributor
sp_MSenumallpublications
sp_MSfetchAdjustidentityrange
sp_MSfix_6x_tasks
sp_MSforce_drop_distribution_jobs
sp_MSget_agent_names
sp_MSget_jobstate
sp_MSget_oledbinfo
sp_MSget_publication_from_taskname
sp_MSgetdbversion
sp_MSgetmaxsnapshottimestamp
sp_MShelp_repl_agent
sp_MShelp_replication_status
sp_MShelp_snapshot_agent
sp_MShelpconflictpublications
sp_MShelpdynamicsnapshotjobatdistributor
sp_MShelplogreader_agent
sp_MShelpsnapshot_agent
sp_MShelptranconflictcounts
sp_MSinit_publication_access
sp_MSreinit_failed_subscriptions
sp_MSremoveoffloadparameter
sp_MSrepl_backup_complete
sp_MSrepl_backup_start
sp_MSrepl_createdatatypemappings
sp_MSrepl_dropdatatypemappings
sp_MSrepl_enumarticlecolumninfo
sp_MSrepl_enumpublications
sp_MSrepl_enumpublishertables
sp_MSrepl_enumsubscriptions
sp_MSrepl_enumtablecolumninfo
sp_MSrepl_getdistributorinfo
sp_MSrepl_startup_internal
sp_MSreplagentjobexists
sp_MSreplcheck_permission
sp_MSreplcheck_pull
sp_MSreplcheck_subscribe
sp_MSreplcheck_subscribe_withddladmin
sp_MSreplcopyscriptfile
sp_MSreplremoveuncdir
sp_MSsetalertinfo
sp_MSSetServerProperties
sp_MSsetupnosyncsubwithlsnatdist
sp_MSsetupnosyncsubwithlsnatdist_cleanup
sp_MSsetupnosyncsubwithlsnatdist_helper
sp_MSstartdistribution_agent
sp_MSstartmerge_agent
sp_MSstartsnapshot_agent
sp_MSstopdistribution_agent
sp_MSstopmerge_agent
sp_MSstopsnapshot_agent
sp_MSupdate_agenttype_default
sp_oledbinfo
sp_procoption
sp_removedbreplication
sp_removesrvreplication
sp_replication_agent_checkup
sp_replicationdboption
sp_resetstatus
sp_restoredbreplication
sp_SetAutoSAPasswordAndDisable
sp_setdefaultdatatypemapping
sp_updatestats
sp_validatelogins
sp_vupgrade_mergeobjects
sp_vupgrade_replication
sp_vupgrade_replsecurity_metadata
xp_repl_convert_encrypt_sysadmin_wrapper
was posted by
19:10:00 . Follow any responses to this post through .
@ 10:06:38
Andreas Wolter: PS: Here the link, just stumbled over it: http://markread.n&Andreas Wolter: PS: I just added a reference to "included columns" and foun&Andreas Wolter: Hi Adrian
Thank you for your helpful feedback and addition&
& XML FeedsRSS 2.0: , Atom: , RDF: , RSS 0.92: ,
Original Mystique theme by
by Sonorth Corp. |
Powered by}

我要回帖

更多关于 Of0 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信