sql >> Base de Datos >  >> RDS >> Sqlserver

¿Puedo establecer un esquema predeterminado dentro de un procedimiento almacenado?

Hay piezas de cómo hacer esto en varios lugares aquí, pero no en todos juntos. La forma de hacerlo es:

  1. Cree un inicio de sesión y un usuario únicos para cada esquema

  2. Haga que estos usuarios sean los propietarios de cada esquema diferente.

  3. Establezca el esquema predeterminado de cada usuario para que sea el esquema de su propiedad.

  4. Use la sintaxis EXECUTE ('sql commands') AS USER = 'schema-owner' para ejecutar sus comandos SQL en el contexto de ese esquema predeterminado.

El siguiente script demuestra esto:

--====== 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'