亚马逊最近宣布support for time zone change in Oracle RDS。
由于Microsoft SQL Server 2012仍然不支持此功能,是否有任何变通方法可以获得与更改整个数据库时区类似的功能?
答案 0 :(得分:1)
因为您要求解决方法......
我们基本上完全忽略服务器时间/数据库时区,完全脱离UTC。 GetUtcDate()
例如适用于所有' DateCreated'列。由于我们已经采用了这种方法,因此我们不会遇到任何问题。
如果您需要将时区与日期数据一起存储,则可以使用DateTimeOffset。
需要注意的是,维护计划将在服务器时间运行。这不是问题,因为我们在任何日历程序中将所有内容规范化为本地时间(不是UTC而不是服务器时间)。
答案 1 :(得分:0)
我通过将我的背景数据库参数组更改为可以编辑参数的自定义数据库,在RDS上使用MySQL完成此操作。
然后我创建了以下过程:
DELIMITER |
CREATE PROCEDURE mysql.init_connect_procedure ()
IF NOT(POSITION(‘rdsadmin@’ IN user()) = 1)
THEN SET SESSION time_zone = 'America/New_York';
END IF |
DELIMITER ;
注意:互联网上的每个其他指令都使用函数current_user()而不是user(),这对我不起作用!
此配置的缺点是,您必须为所有数据库用户授予权限才能执行此功能,否则他们甚至无法连接到数据库,因此对于每个用户和每个将来的用户都必须运行此命令。 (并且没有通配符访问过程)
GRANT EXECUTE ON PROCEDURE mysql.init_connect_procedure TO 'user'@'%' ;
我修改了参数init_connect
以设置为CALL mysql.init_connect_procedure
。我确信SQL SERVER有一个等效的参数,如果不相同的话。
重新启动服务器,你应该很好!
警告:用户rdsadmin是只有Amazon拥有密码并用于维护和备份数据库的root用户。您不想更改此用户的时区,否则可能会损坏整个数据库。因此代码确保它不是这个用户。我真的建议确保SQL SERVER的用户是一样的,这个解决方案只针对MySQL而且是一个糟糕的解决方案,不幸的是我别无选择。如果您可以避免这样做,请在应用程序端处理时区。