我对 SQL Server 有点陌生,我正在尝试编写 Microsoft SQL Server (2005-2014) 安装后活动的脚本,但我在更改登录时遇到了一些困难。公司政策规定没有登录应该默认使用 master 数据库,因此我的计划是识别所有默认使用 master 的登录并将 master 更改为 tempdb。
可以使用这样的查询更改单次登录:
ALTER LOGIN [sa] WITH DEFAULT_DATABASE = tempdb
Run Code Online (Sandbox Code Playgroud)
试图在所有登录中实现这一点(不知道它们的数量和名称),我知道我很天真,希望这样的事情会起作用(但不得不尝试):
UPDATE master..syslogins
SET dbname = 'tempdb'
WHERE dbname = 'master'
Run Code Online (Sandbox Code Playgroud)
显然输出是一个错误(逻辑上):
Ad hoc updates to system catalogs are not allowed.
SQL Server 处于 MIX 身份验证模式,因此几乎所有内容都可以登录 - SQL 登录、Windows 本地或域用户或组(不确定这是否会对解决方案产生任何影响)。解决方案应该与版本无关,但是假设从 SQL Server 2005 向前启动(...是的,仍然有一些古老的版本...)
任何人都可以帮我找到合适的查询来实现这一目标吗?
我创建了两个对应于两个 Windows 组的 SQL Server 登录名:
MachineName\MyAppAmdin
MachineName\MyAppUser
Run Code Online (Sandbox Code Playgroud)
然后在数据库中,我创建了两个具有相同名称的用户并将它们映射到登录名。
在 Windows 服务器中,我将我的域帐户添加MyDomain\MyAccount
到MachineName\MyAppAmdin
组中。
现在我可以通过 Windows 身份验证通过MyDomain\MyAccount
.
问题是,我想确切地知道我正在使用哪个 Windows 组登录,但我不知道如何。
我试过:
ORIGINAL_LOGIN()
SYSTEM_USER
SUSER_SNAME
SELECT * FROM dm_exec_sessions
Run Code Online (Sandbox Code Playgroud)
以上所有内容都会返回MyDomain\MyAccount
,但我需要知道的是我是否通过MachineName\MyAppAmdin
.
总结一下,我的问题是:
有没有办法准确判断当前连接使用的是哪个 Windows 组登录(或用户)?
或者有什么方法可以检查是否MyDomain\MyAccount
与特定用户或登录名相关联?
我知道我可以使用 C# 或命令来解析域帐户是否属于特定的 Windows 组,但是我们有一些新的 IT 策略,所以我正在考虑使用 TSQL 实现类似结果的方法。
我最近开始使用包含的数据库,但我不明白包含的数据库用户是否/如何拥有过期的密码。
MSDN 文档说他们这样做 - 使用 SQL Server 登录,有强制密码过期的选项框,但对于包含的数据库用户来说,这不存在(据我所知)。
这些包含的数据库帐户已经存在一段时间了,我们的域策略是每 6 个月重置一次密码,但我们从未更改过这些密码,而且应用程序在过去几年中使用相同的密码连接得很好。
我的第一个问题是我怎么知道对包含的数据库用户强制执行“密码过期”?对于 SQL 登录is_expiration_checked
,sys.sql_logins
.
使用传统的 SQL 登录,我可以使用以下函数来获取更改 SQL Server 登录的时间
LOGINPROPERTY('login','PasswordLastSetTime')
Run Code Online (Sandbox Code Playgroud)
包含的数据库用户是否有类似的东西?
我执行了以下操作:
USE [MyDatabase];
GO
CREATE LOGIN [MyDomain\MyAccount] FROM WINDOWS WITH DEFAULT_DATABASE=[MyDatabase];
CREATE USER [MyDomain\MyAccount] FOR LOGIN [MyDomain\MyAccount];
GRANT EXECUTE ON SCHEMA::[MySchema] TO [MyDomain\MyAccount];
GRANT SELECT ON SCHEMA::[MySchema] TO [MyDomain\MyAccount];
GRANT INSERT ON SCHEMA::[MySchema] TO [MyDomain\MyAccount];
Run Code Online (Sandbox Code Playgroud)
(我没有授予任何角色,因为我不希望此登录名能够访问此数据库中的任何其他架构。)
我以 MyDomain\MyAccount 的身份运行 SSMS(以不同的用户身份运行)。然后我尝试连接到这个实例。但是,我得到:
无法打开用户默认数据库。登录失败。用户
“MyDomain\MyAccount”登录失败。(Microsoft SQL Server,错误:4064)
如果我在连接属性中将默认数据库设置为 MyDatabase,我会得到相同的结果。
我运行了 Profiler 跟踪并看到错误 18456 状态 38:
用户“MyDomain\MyAccount”登录失败。原因:无法打开明确指定的数据库“MyDatabase”。[客户:MyIpAddress]
接下来是错误 18456 状态 40:
用户“MyDomain\MyAccount”登录失败。原因:无法打开登录属性中指定的数据库“MyDatabase”。[客户:MyIpAddress]
MyDatabase 在线,我可以使用其他登录名轻松连接到它。我需要向 MyDomain\MyAccount 授予哪些额外权限?还有什么我想念的吗?
在我的数据库中,我有一个名为 spGen2_tblIE_SchedProcess_Update 的过程。
当我运行这个脚本时
select * from sys.objects
where name = 'spGen2_tblIE_SchedProcess_Update'
Run Code Online (Sandbox Code Playgroud)
在同一个数据库中,我有一个名为 tblIE_Step 的表
当我运行以下脚本时
select * from sys.objects
where name = 'tblIE_Step'
Run Code Online (Sandbox Code Playgroud)
然后我想查看对象的所有权限。
当我检查我的存储过程时,我运行了这个脚本:
select 'Proc' = SCHEMA_NAME(p.schema_id)+'.'+p.name
, 'Type' = per.state_desc, 'Permission' = per.permission_name
, 'Login' = pri.name, 'Type' = pri.type_desc
, *
From sys.objects as p
left join sys.database_permissions as per on p.object_id = per.major_id
left join sys.database_principals as pri on per.grantee_principal_id = pri.principal_id
where p.object_id = 87671360
Run Code Online (Sandbox Code Playgroud)
我得到了权限:
但是当我为我的桌子运行相同的东西时,我什么也没得到:
select 'Proc' = SCHEMA_NAME(p.schema_id)+'.'+p.name …
Run Code Online (Sandbox Code Playgroud) 是否可以找出谁使用了 SQL-Server 登录?
让我们假设我们怀疑有人滥用 SQL 登录名,该登录名本应由应用程序仅用于登录 SQL-Server。使用SQL登录的域用户是否记录在任何地方,以便我们得出谁使用它的结论?
我可以使用哪些查询来列出 SQL Azure 中服务器和数据库的所有登录信息?
我试过跑步,select * from sys.sysusers
但我猜这只是向用户展示
还有其他类似的问题被问到,但没有一个能告诉我为什么我不能使用我站起来的 C# .NET 网站进行连接。虽然我知道这个论坛更适合 DBA 使用工具连接到数据库,而不是解决应用程序连接问题,但我想我会在这里发布这个问题。
当从 Visual Studio 运行时,该网站从我的工作站工作/连接,但是当我将其发布到服务器时,它给了我ORA-01017: invalid username/password;logon denied
错误,即使我可以使用相同的帐户/密码通过其他所有内容进行连接。情况:
tnsping CONNECTION_NAME
成功。ORACLE_HOME
=C:\oracle\product\12
PATH
= C:\oracle\product\12\bin;
..... TNS_ADMIN
= C:\oracle\product\12\network\admin
HKLM\Software\Oracle\KEY_OraClient12Home
for TNS_ADMIN
= 的注册表项C:\oracle\product\12\network\admin
ALTER SYSTEM SET SEC_CASE_SENSITIVE_LOGON = FALSE;
命令并重置了密码,以防万一这是问题所在。我尝试连接 myaccount 的全大写版本及其密码,以及两者的所有小写版本(两者的小写版本是我最初在我的工作站上使用时的方式)。PASSWORD_VERSIONS
的10G
和11G
-如果它的事项,我使用一个12C客户端和我不知道12C …
问题:
作为一名未经培训且非自愿的 SQL DBA,我正在使用一组 SQL 2008R2 数据库并在另一个环境中恢复到新的 SQL 2008R2 服务器。
恢复过程顺利,没有错误。当我尝试使用我们的数据库资源管理器连接到它们时,我看到数据库和表正确填充。不幸的是,当我尝试查看表的数据时,它给了我一个“无效对象”错误。
背景:
当我们过去为其他客户端执行这些操作时,我们通常会运行此脚本来“修复孤立用户”。这通常是我们运行的全部内容,然后数据库与我们的 db explorer 和软件一起工作。如果我们在 SQL 版本之间切换,我们还将使用单独的脚本更改数据库的兼容模式
use dbar;
EXEC sp_change_users_login 'update_one', 'nurse', 'nurse';
use dbarforms;
EXEC sp_change_users_login 'update_one', 'nurse', 'nurse';
use dbdoc;
EXEC sp_change_users_login 'update_one', 'nurse', 'nurse';
use dbhistory;
EXEC sp_change_users_login 'update_one', 'nurse', 'nurse';
use dbhl7;
EXEC sp_change_users_login 'update_one', 'nurse', 'nurse';
use dbmds;
EXEC sp_change_users_login 'update_one', 'nurse', 'nurse';
use dbparadox;
EXEC sp_change_users_login 'update_one', 'nurse', 'nurse';
use dbpicklist;
EXEC sp_change_users_login 'update_one', 'nurse', 'nurse';
use dbreport;
EXEC sp_change_users_login 'update_one', 'nurse', …
Run Code Online (Sandbox Code Playgroud) 我已经设置了一个新的数据库,我可以通过 SQL Server Management Studio 连接到该数据库并像平常一样执行操作。我创建了两个帐户供我的应用程序使用,并且都可以通过 SSMS 登录。我的程序正在运行 java 并使用“mssql-jdbc-6.4.0.jre8.jar”驱动程序,当我尝试连接时,我可以在数据库日志中看到以下错误:
错误:18456,严重性:14,状态:149 用户“application_read_only_user”登录失败。原因:基于登录的服务器访问验证因基础结构错误而失败。登录缺少连接端点权限。[客户端:127.0.0.1]
我查看了多个来源试图解决这个问题。微软官方文档似乎没有列出状态 149,我在网上找到的任何结果也没有列出。
我没有修改原始设置的端点,所以我只有以下项目:
我尝试将 SQL Server 服务设置为作为本地系统运行。
该网站上有很多类似的问题和堆栈溢出,但没有一个能够提供帮助。它们要么具有不同的状态,要么不列出状态。
logins ×10
sql-server ×7
password ×2
permissions ×2
schema ×2
t-sql ×2
users ×2
automation ×1
oracle ×1
oracle-12c ×1
scripting ×1
security ×1