无法在SQL Server 2016 Express中创建或查找架构

问题描述:

我的程序在运行时创建数据库和表。我对Schema的理解是它是多个数据库和数据库表的概念文件夹。所以我写了一些无意义的代码来测试一下模式会对我的代码做些什么。无法在SQL Server 2016 Express中创建或查找架构

我的程序中使用SQL Server身份验证,而不是Windows身份验证,而不是TmpUserSA的用户名进行创建数据库和表。

如果我通过CREATE TABLE TmpTable创建一个表格,我会得到dbo.TmpTable表名称。如果我明确CREATE TABLE abc.TmpTable键入一个新的架构,然后我得到以下异常,因为模式不存在:

SQLEXCEPTION:在指定架构名称不存在,或者你 没有使用它

许可

我进入SSMS并通过执行CREATE SCHEMA abc手动创建一个模式。 SSMS输出表明abc的模式已经成功创建。但在SSMS 对象浏览器>安全>我看到没有架构名称,也没有任何其他名称abc

我的模式在哪里?如果abc未创建,那么为什么CREATE SCHEMA abc被执行,它创建了什么?

我又回到Visual Studio和CREATE TABLE abc.TmpTable了,仍然收到相同的异常。

+0

你可以为每个数据库创建模式,你确定在调用create schema abc后,你无法在[DatabaseName] \ Security \ Schemas下找到它吗? – Behzad

+0

我在SeverInstance \ Databases \ System Database \ master \ Security \ Schema中找到它,但从我读的教程中,它应该位于SeverInstance \ Security中,但即使Schema文件夹也不存在。另外当我在C#中创建abc.TmpTable时,我仍然得到架构不存在的异常 – KMC

您的TmpUser无权访问该架构。

选项从https://docs.microsoft.com/en-us/sql/t-sql/statements/create-schema-transact-sql报价1

CREATE SCHEMA abc AUTHORIZATION TmpUser; 

“授权OWNER_NAME 指定数据库级主体的将拥有架构名称,这个主要可以拥有其他架构,并且可能不会。使用当前模式作为其默认模式。“

TmpUser将拥有架构,因此将有权限访问它。

选项2

明确授予权限的TmpUser:

GRANT SELECT, UPDATE, DELETE, INSERT SCHEMA abc TO TmpUser; 

查看https://docs.microsoft.com/en-us/sql/t-sql/statements/grant-schema-permissions-transact-sql

这就像选1的用法,但你可以细粒度的权限。

选项3

穿戴TmpUser一些数据库角色,例如db_datareader:

USE MyDatabase 
GO 
ALTER ROLE db_datareader ADD MEMBER TmpUser 

TmpUser将具有对数据库中所有模式的读访问权限。

选项4

它类似于选项3,但不是使用内置的角色,创建自己的一个:

USE MyDatabase 
GO 
CREATE ROLE myrole 
GRANT SELECT, DELETE, INSERT, UPDATE, EXECUTE TO myrole 
ALTER ROLE myrole ADD MEMBER TmpUser 

在myrole用户将具有读/写/执行访问数据库中的所有模式。