当涉及到 dbo 架构时:
我了解SQL Server 架构的功能,但最佳实践是什么?当然,它们提供了另一层安全性,并在数据库内提供数据库对象的逻辑分组,但那里的典型情况是什么?根据我的经验,我经常看不到许多定制的模式被利用。这是典型的吗?是不是应该使用自定义模式的不太频繁的场景?
我主要是一名应用程序开发人员,但发现自己必须为我当前的项目(顺便说一句......它的 MS SQL Server 2008)做所有的前期数据库工作。作为第一个决定,我试图弄清楚是使用单独的数据库还是在同一数据库中使用单独的架构来划分我的状态。我对 SQL Server Schema 进行了一些阅读,这似乎是一种分离对象域(我喜欢)的自然方法,但我不确定这种模式是否存在隐藏成本。
在这两种方法之间进行选择时,我应该考虑哪些更实际的事情?如果我避免dbo.mytable
赞成,myschema.mytable
我是否会为我的架构带来其他挑战(或问题)?
作为旁注......在某些时候,这将被移交给真正的DBA 来维护/支持,所以我试图确保我不会让他们的生活变得更艰难。
我们有以下设置:
目前网站登录web数据库,web数据库连接中间数据库,在生产数据库上拉取数据或执行存储过程。所有数据库都在同一个SQL实例上,整个过程使用同一个用户账号。
用户账户对web数据库和中间数据库有完全访问权限,但只能访问私有数据库的特定视图和存储过程
这真的比让公共数据库直接连接到私有数据库更安全吗?
中间数据库似乎只是为了使事情复杂化,因为使用相同的登录名访问所有数据库中的数据,并且它已经仅限于私有数据库中所需的视图/SP。我希望删除它。
我有一个过程,它遍历数据库中的所有对象并为它们分配适当的权限给该对象。我想知道是否有更好的方法来做到这一点?我使用模型数据库来创建新数据库,因此每次创建新数据库时都必须运行它。这是它的外观的一个想法(注意:从一开始就丢失了一个块,它会删除所有用户并重新创建必要的用户;自从 SID 更改后,这是必要的):
CREATE PROCEDURE usp_SetPermissions
AS
BEGIN
DECLARE @CurrentId INT
DECLARE @ObjectName NVARCHAR(128)
DECLARE @Message NVARCHAR(160)
DECLARE @Error INT
DECLARE @Sql NVARCHAR(256)
CREATE TABLE #tmpDbObjects
(
ID INT IDENTITY(1,1),
ObjectName NVARCHAR(128),
Completed BIT
)
INSERT #tmpDbObjects(ObjectName, Completed)
SELECT DISTINCT [Name], 0 As Completed
FROM sys.objects
WHERE [type] = 'U' AND is_ms_shipped <> 1
WHILE EXISTS (SELECT 1 FROM #tmpDbObjects)
BEGIN
-- Pick first uncompleted object
SELECT TOP 1 @CurrentId = ID,
@ObjectName = ObjectName
FROM #tmpDbObjects
-- Grant permissions …
Run Code Online (Sandbox Code Playgroud)