Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Kann ich innerhalb einer gespeicherten Prozedur ein Standardschema festlegen?

Es gibt hier an verschiedenen Stellen Teile davon, wie man das macht, aber nicht alle. Der Weg, dies zu tun, ist:

  1. Erstellen Sie für jedes Schema einen eindeutigen Login und Benutzer

  2. Machen Sie diese Benutzer zu Eigentümern der verschiedenen Schemas.

  3. Legen Sie das Standardschema jedes solchen Benutzers auf das Schema fest, das er besitzt.

  4. Verwenden Sie die Syntax EXECUTE ('sql commands') AS USER = 'schema-owner' um Ihre SQL-Befehle im Kontext dieses Standardschemas auszuführen.

Das folgende Skript demonstriert dies:

--====== Create the Login for the User:
CREATE LOGIN [UserTest1] WITH PASSWORD='whatever', DEFAULT_DATABASE=[TestUsers], DEFAULT_LANGUAGE=[us_english]
GO

--====== Make a User for the Login:
CREATE USER [UserTest1] FOR LOGIN [UserTest1]
GO

--====== Make a Schema owned by the User and default to it:
--        (I assume that you already have the schemas)
CREATE SCHEMA [UserTest1] AUTHORIZATION [UserTest1]
GO
ALTER USER [UserTest1] WITH DEFAULT_SCHEMA=[UserTest1]
GO

--====== Make a sProc in dbo
CREATE PROCEDURE [dbo].[TestSchema_Exec] AS
    SELECT 'executing in schema [dbo]'
GO
--====== Make a similar sProc in New Schema
CREATE PROCEDURE [UserTest1].[TestSchema_Exec] AS
    SELECT 'executing in schema [UserTest1]'
GO

--========= Demonstrate that we can switch Default Schemas:
EXEC('TestSchema_Exec')

EXEC('TestSchema_Exec') AS USER = 'UserTest1'