SQL Server 2008数据库设计问题.
我正在定义一种服务的体系结构,其中站点用户可以管理他们拥有的多个网站上的大量数据(平均100MB,每个站点最多1GB).我正在考虑是否拆分数据库,以便核心站点管理表(用户,付款,联系方式,登录详细信息,产品等)保存在一个数据库中,与客户自己的网站相关的数据库是单独保存的数据库.
我看到了一个可能的好处,我可以分发硬件架构,为网站数据库中的繁重工作提供更多的肉,使网站管理数据库处于更合适的区域.但我也意识到失去了通过外键直接将网站与客户联系起来的能力(据我所知,这不能跨数据库完成?).
因此,问题有两个 - 一般来说,这种场景中的数据应该分成多个数据库,还是应该全部保存在一个数据库中?
如果将其拆分为多个,是否有建议的方法来保护系统在数据库层的完整性和安全性,以确保两者之间存在很强的关系?
谢谢你的帮助.
我一直最讨厌 MS SQL Server 中的一件事就是安全性的工作方式。如果你有趣地看待服务器,安全上下文会不断切换,而且通常很难(无论如何对我来说)预测或调试。
在今天处理一个问题时,我想,“我希望我可以在代码中添加一行,以显示 SQL Server 在代码运行时使用的安全上下文。” 存在这样的命令吗?例如,SELECT security_context()
更清楚一点...如果我处于存储过程中并且因此受到 SP 所有者的安全上下文的约束,那么我希望看到这一点。如果我在由 sp_executesql 调用的代码中,并且它导致安全性处于 SQL Server 服务帐户的上下文中,那么我希望看到这一点。
至少这样我也许能够弄清楚为什么 SQL Server 认为我不应该访问某些内容。
谢谢!
例子
-- Set up
CREATE USER Test_User WITHOUT LOGIN
CREATE TABLE Test_Security_Context (my_id INT)
INSERT INTO Test_Security_Context VALUES (1)
DENY SELECT ON Test_Security_Context TO Test_User
GO
CREATE PROCEDURE Test_Security_Context_SP
AS
SELECT SUSER_SNAME()
SELECT * FROM Test_Security_Context -- This will return ok
EXEC('SELECT SUSER_SNAME(); SELECT * FROM Test_Security_Context') -- SUSER_SNAME() will match above but select fails …Run Code Online (Sandbox Code Playgroud) 我有一些表可以从多对多表中受益.例如团队表.
团队成员可以在团队中持有多个"职位",所有职位都列在职位数据库表中.以前持有的头寸也存放了这个我有一个单独的表,所以我有
很简单,但现在的关键是团队成员可以属于许多团队.我已经有一个team_to_member查找表.现在问题是如何将一个职位与团队联系起来?一名成员可能是一个团队的团队领导,目前是另一个团队的团队电台人员和新闻官.我如何只是提取每个成员的信息以显示他当前的位置,以及他过去的历史,包括过去的球队.我是否需要添加一个position_to团队表并以某种方式交叉引用,或者我可以将团队添加到成员到职位表?
一切都非常令人困惑,这种正常化.
[使用SQL Server 2005]
我有一个充满用户的表,我想通过在分配表中创建一个新条目以及在课程跟踪表中的新条目将表中的每个用户(16,000+)分配给一个课程,这样他们的数据就可以了跟踪.问题是我不知道如何在SQL中进行循环,因为我认为你不能,但必须有办法做到这一点......
对于TABLE中的每个用户,使用来自用户TABLE的userID向两个表中的每一个写一行...
我该怎么做?请帮忙!
我目前处于这样一种情况:我们正在创建一个"Facade"数据库,它基本上由一组视图组成,这些视图只是从另一个数据库中同名的表中选择.我们的想法是,可以将应用程序重新命名为facade数据库,只需对实际代码进行最少的更改.
这似乎适用于插入,更新,删除,显然选择.不幸的是,一些存储过程在某些地方使用TRUNCATE TABLE.这是非常有限的,我们现在的计划是通过调用"TRUNCATE"存储过程来替换该代码,该存储过程实际上将处理幕后的表截断.在开始之前,我想看看是否有任何其他建议如何处理这个问题.
感谢您的任何建议或意见!
我有一个nvarchar列,它也有非英语(az)字符,如Crystal77,BólidoComidas.
如何在该列中专门选择包含非英文字符的行?
谢谢
我正在为我们的应用程序中的新功能工作线框.其中一个要求是每个用户都有一个要处理的事项列表.
我计划使用SQL Server 2008服务代理向用户发送待办事项的通知.
但是,通过代理队列的工作方式,我无法在单个队列中隔离用户的消息.我只能在检索到邮件后看到.但是,我只希望它为正在调用它的用户检索消息.
因此,如果我想使用代理服务,我需要为每个用户提供一个单独的队列.
然后我最终会在经纪人服务中拥有数百万个队列.
我是否缺少代理服务的任何功能,可以允许我有一个队列但是使用过滤器检索邮件?
SQL Server 2008代理服务可以处理数百万个队列,是否可以这样做?
在我的代码中我到处都有
command.Parameters.Add("@name", DbType.String).Value = name;
Run Code Online (Sandbox Code Playgroud)
有没有更简单的方法?我很乐意做类似的事情
command.command.CommandTextFn("insert into tbl(key,val) values(?, ?);", key, value);
Run Code Online (Sandbox Code Playgroud)
并确定键/值是字符串还是int.我不介意我是否必须使用{0}而不是?
我正在使用一个系统,该系统必须根据在另一个数据库中创建的对象在一个数据库中创建对象.对象不是重复的,所以我不能简单地复制对象.
我有下面的代码,简化了我正在尝试做的事情.如果取消注释ALTER DATABASE语句,它将运行而没有任何错误.这有可能创造一个安全漏洞,所以我想尽可能避免它.
我尝试过使用证书和假冒,但似乎没有任何效果.我认为DDL触发器在用户与登录时忽略了很多安全性.我也试着创造Test_DB_2存储过程中它调用了Test_DB_1 SP和具有存储过程,而不是由触发器调用,但这并没有帮助.
所以,你的挑战,如果你愿意接受它,是让下面的代码,而无需设置TRUSTWORTHY ON(或数据库链接转向如果有任何影响)工作.
感谢您提供的任何帮助!
/************************
SET-UP THE TEST
************************/
USE master
GO
CREATE LOGIN Test_Security_Login WITH PASSWORD = 'p@ssw0rd1!'
CREATE DATABASE Test_DB_1
CREATE DATABASE Test_DB_2
GO
USE Test_DB_1
GO
CREATE PROCEDURE dbo.Create_View
AS
BEGIN
EXEC('CREATE VIEW Test_View AS SELECT 1 AS one')
END
GO
CREATE USER Test_Security_User FOR LOGIN Test_Security_Login
GRANT EXECUTE ON dbo.Create_View TO Test_Security_User
GO
USE Test_DB_2
GO
CREATE TRIGGER DDL_TRIGGER ON DATABASE WITH EXECUTE AS 'dbo' FOR DDL_VIEW_EVENTS
AS
BEGIN
EXEC …Run Code Online (Sandbox Code Playgroud) ----------
User
----------
user_ID(pk)
UserEmail
----------
Project_Account
----------
actno
actname
projno
projname
ProjEmpID
ProjEmpMGRID
Run Code Online (Sandbox Code Playgroud)
其中ProjEmpID,ProjEmpMGRID是user_id,ProjEmpMGRID可以为null.我需要查找useremail并显示表project_account.我需要使用具有重复值的actNo进行查询.
我的查询是这样的:
select projno,projname,actno,actname,
(select u.user_email as project_manager from project_account c left outer join users u
on u.user_id = c.ProjEmpID where actno='some no')as project_manager,
(select u.user_email as program_manager from project_account c left outer join users u
on u.user_id = c.ProjEmpMGRID where actno='someno') as program_manager
from project_account where actno='someno'
Run Code Online (Sandbox Code Playgroud)
我在Oracle中收到的错误消息:
ora-01427单行子查询返回多行
当我的子查询返回多个电子邮件ID时,我收到此错误.正如我所说,行为不是不唯一的.我能理解错误,但我无法弄清楚解决方案.我在子查询中执行左外连接,因为prog manager id中可能有空值.
任何帮助,将不胜感激.